2014-09-10 53 views
2

我是Matlab新手,我被困在有效解決以下問題。比較並找到2維數組中的字符串

我有兩個陣列(兩者2D),我想通過關口檢查陣列1山坳知道有多少元素出現在數組2的各個關口(比較山坳對col)

例如

array1 

    --------- 
    'a1' 'b1' 'c1' 
    'd1' 'e1' 'f1' 

array2 
---------- 
    'a1' 'a1' 'b1' 'b1' 'a1' 
    'd1' 'd1' 'c1' 'd1' 'c1' 
    'c1' 'c1' 'b1' 'd1' 'd1' 

我試圖讓下面的輸出

2 elements from array1 col1 appear in array2 col1 
2 elements from array1 col1 appear in array2 col2 
0 elements from array1 col1 appear in array2 col3 
1 elements from array1 col1 appear in array2 col4 
2 elements from array1 col1 appear in array2 col5 

0 elements from array1 col2 appear in array2 col1 
0 elements from array1 col2 appear in array2 col2 
1 elements from array1 col2 appear in array2 col3 
1 elements from array1 col2 appear in array2 col4 
0 elements from array1 col2 appear in array2 col5 

1 elements from array1 col3 appear in array2 col1 
1 elements from array1 col3 appear in array2 col2 
1 elements from array1 col3 appear in array2 col3 
0 elements from array1 col3 appear in array2 col4 
1 elements from array1 col3 appear in array2 col5 
and so on 

現在我試着做下面的醜陋的代碼獲得部分輸出

for i=1:size(Array1,2) 
    for m=1:size(Array1,1) 
    element = Array1(i,m); 

    indx =find(ismember(Array2,element)); 
    Array_match(indx) = Array_match(indx) + 1; 
    end 
    for s=2:size(Array1,1) 
    if length(char(Array1(s,i))) > 0 
     tt= tt + 1; 
    end 
    length(Array_test_words(s,i)) 
    end 
    Indx2 = find((Array_match) > tt); 
end 
+0

所以它的工作原理,你想如何提高代碼輸入或它不行? – 2014-09-10 12:59:38

+0

行爲是不穩定的......當我一個接一個地嘗試它時,它的工作原理是,當我打開循環一次運行時,它給了我意想不到的值。 – Aabualia 2014-09-10 13:01:48

+0

這些單元格是否總是有單個字符串? – Divakar 2014-09-10 13:26:37

回答

2

應用unique雙方的級聯數組將單元格轉換爲數字標籤。刪除第二個數組每列中的重複值。然後測試與bsxfun平等和彙總結果列的每個組合:

[~, ~, labels] = unique({array1{:} array2{:}}); 
a1 = reshape(labels(1:numel(array1)),size(array1)); %// array1 as numeric labels 
a2 = reshape(labels(numel(array1)+1:end), size(array2)); %// same for array2 
a2 = sort(a2); 
a2(diff([NaN(1,size(a2,2)); a2])==0) = NaN; %// remove repeated values 
m = bsxfun(@eq, permute(a1, [1 3 2]), permute(a2, [3 1 4 2])); %// find matches 
result = squeeze(sum(reshape(m, [],size(a1,2),size(a2,2)), 1)); 

在你rexample這給

result = 
    2  2  0  1  2 
    0  0  1  1  0 
    1  1  1  0  1 
3

假設輸入單元陣列具有單一字符串的所有細胞,這可能爲你工作 -

%// Input cell arrays 
array1 = { 
    'a1' 'b1' 'c1' 
    'd1' 'e1' 'f1'} 

array2 = { 
     'a1' 'a1' 'b1' 'b1' 'a1' 
    'd1' 'd1' 'c1' 'd1' 'c1' 
    'c1' 'c1' 'b1' 'd1' 'd1'} 

%// Convert input cell arrays to numeric arrays 
array1n = char(array1)-0 
array1n = reshape(array1n(:,1) * 1000 + array1n(:,2),size(array1)) 

array2n = char(array2)-0 
array2n = reshape(array2n(:,1) * 1000 + array2n(:,2),size(array2)) 

out = squeeze(sum(any(bsxfun(@eq,array2n,permute(array1n,[3 4 1 2])),1),3)) 

輸出 -

out = 
    2  0  1 
    2  0  1 
    0  1  1 
    1  1  0 
    2  0  1 
+0

a,b,c,d,e,f是我應該提及'a','b','c'等字符... – Aabualia 2014-09-10 13:19:31

+0

@Aabualia請用一些可重現的代碼編輯你的問題,包括生成輸入數組,以便我們可以測試代碼。 – Divakar 2014-09-10 13:21:46

+0

@Aabualia查看編輯! – Divakar 2014-09-10 13:34:10