2011-05-19 39 views
1

ismember檢查細胞陣列或矩陣元素串矩陣電池元件。我們如何一起檢查字符串 - 數字元素?請看下面:ismember在MATLAB

cell1 = {'netincome' [1] ; 'equity' [2] } ; 

cell2 = { 'cogs' [2222] [1] ; 'equity' [3501] [2] ; 

      'equity' [3333] [1] ; 'netincome' [1751] [1] } ; 

這種失敗 - > ismember(小區1(:,[1〜2]),小區2(:[1〜3])%我知道失敗的原因

有什麼。辦法從2個小區對應的字符串元素和數字元素我試圖用ismember獨立(使用cell2mat FUNC),但仍不能打到正確答案的期望?答案是:。

[1751 ; 3501] ; OR 'netincome' [1751] [1] ; 'equity' [3501] [2] 
+0

幾個問題:是否在'cell1'條目和'cell2'唯一的(即不重複)? 'cell1'中的條目是否保證'cell2'中的匹配? – gnovice 2011-05-19 21:33:36

+0

Ans1。當您將col1和col2放在一起時,「cell1」條目是唯一的。對於col1和col3,「cell2」條目不是唯一的。某些行可以重複Ans2。是的,總是! – Maddy 2011-05-19 23:25:46

回答

1

我不認爲對於這種情況,有很好的內置解決方案,目前我能想到的最好的解決方案是創建兩個嵌套循環來比較所有的每個單元陣列電子行,並使用該函數ISEQUAL做比較:

index = zeros(size(cell1,1),1); 
for row1 = 1:size(cell1,1) 
    for row2 = 1:size(cell2,1) 
    if isequal(cell1(row1,:),cell2(row2,[1 3])) 
     index(row1) = row2; 
     break 
    end 
    end 
end 

其結果將是一組匹配指標在N×1向量index,其中N是行中的數字的cell1。如果一行cell1不能與cell2的任何一行中的數據相匹配,則index的對應條目將爲0. index中匹配的索引將保留cell1中的數據的原始順序。此外,此代碼忽略cell2中的多個匹配,僅返回找到的第一個匹配的索引並打破內部循環(這可能會減少所需的迭代次數)。

現在你可以索引cell2來獲取數據對應什麼在cell1

>> cell2(index,:) 

ans = 

    'netincome' [1751] [1] 
    'equity'  [3501] [2] 
+0

謝謝gnovice。維持秩序是重要的!你能提出改變嗎?將不勝感激。 – Maddy 2011-05-19 21:29:35

+0

@Maddy:我已經更新了我的答案,以便維護訂單。 – gnovice 2011-05-19 21:51:34

+0

嗨..請參閱我對您的1Q的迴應。我正在嘗試查看cell2中的重複內容是否可以處理/刪除。如果您有任何意見,請告訴我。謝謝。 – Maddy 2011-05-19 23:30:11