2014-07-15 107 views
1

我有兩個單元陣列,大小是1x20033和1x19。我們將這兩個單元格數組稱爲A和B.我想將A的每個單元格與B的每個單元格進行比較,以查看是否有任何公共元素。Matlab,找到兩個單元陣列的通用元素

最後,我需要建立一個二進制矩陣,並在出現匹配時放置一個矩陣。

我嘗試這樣做:

BinaryMatrix=zeros(20033,19); 

for i=1:1:20033 

    for j=1:1:19 
     match=find(ismember(A{i},B{j}));   
     if match==1 
      BinaryMatrix(i,j)= 1;   
     end 
    end 
end 

但我面臨這個錯誤:「輸入A類細胞的類雙和輸入B的必須是字符串的 單元陣列,除非一個是字符串」

請告訴我我應該怎麼做才能解決它?

+0

取代''通過any' find'?另外,這些單元格包含什麼? –

+0

每個單元格都包含一串單詞。這些字符串的長度是不同的。一個可能是20,另一個是300. – user36729

+0

你嘗試過使用'intersect'嗎? – rayryeng

回答

2

您幾乎可以使用的代碼。我建議你做的是將空間中的AB中的字符串分開。因此,AB然後將是元素的單元陣列,其中AB中的每個元素是單個詞。這些空格將作爲分隔詞的分隔符。

一旦你這樣做,使用intersect來查看A中的單詞和B中的單詞之間是否有任何常見單詞。 intersect通過將兩個數組(它們可以是數值數組,單元陣列等)CD作爲集合起作用,並且它返回這兩個數組之間的集交集。

在我們的情況下,CD將是從AB由空格分隔單詞的單元陣列。 intersect(C,D)將返回字符串的單元數組,其中輸出中的每個元素都是中的字符串,這兩個字符串均爲CD。因此,如果這個單元陣列不是空的,我們在CD之間找到至少一個常用單詞。如果是這樣的話,那麼在你的矩陣的位置設置你的二進制標誌爲1。換句話說:

BinaryMatrix = false(20033,19); 

for i=1:1:20033 
    for j=1:1:19 
     Asplit = strsplit(A{i}); 
     Bsplit = strsplit(B{j}); 
     if (~isempty(intersect(Asplit, Bsplit))) 
      BinaryMatrix(i,j)= true;   
     end 
    end 
end 

你會發現,我從zeros(20033,19)改變了你的矩陣,以false(20033,19)。之所以會這樣做,是因爲在做zeros時,您在矩陣中爲每個數字分配了8個字節,因爲這會以雙精度創建您的矩陣。通過做false,這將是一個logical矩陣,而您正在爲每個數字分配1個字節。看到您想要BinaryMatrixtruefalse,請勿使用double - 請使用logical。我不知道這兩個單元陣列有多大,所以這樣做會降低你的內存消耗8

小注

strsplit只能從R2013a及以後。如果您有一個R2012b及更低版本的MATLAB,請將strsplit替換爲regexp。因此,你會替換for環與兩條線:

Asplit = regexp(A{i}, ' ', 'split'); 
Bsplit = regexp(B{j}, ' ', 'split'); 
+0

很好的回答! +1 –

+0

@LuisMendo - 我站在巨人的肩膀上:)我只從最好的方面學習,包括你。謝謝! – rayryeng

+0

哈哈哈,謝謝!偉大的發明,這堆棧溢出 –