2012-10-29 94 views
2

我正在尋找一個快速/簡潔的方式來檢查一些矩陣是否包含給定的載體,例如:矩陣是否包含矢量?

bigMatrix = [1 1 1; 2 2 2; 4 4 4; 5 5 5]; 

someFunction(bigMatrix, [1 1 1]) % = true 
someFunction(bigMatrix, [3 3 3]) % = false 

是否有這樣的功能/操作員,或者我需要一個循環?

回答

10

我建議以下解決方案:

bigMatrix = [1 1 1; 2 2 2; 4 4 4; 5 5 5]; 
Vec = [2 2 2]; 
Index = ismember(bigMatrix, Vec, 'rows'); 

結果?

Index = 

0 
1 
0 
0 

ismember是檢查一組中的元素是否是在另一組一個非常有用的功能。在這裏,我利用行選項來強制函數比較行,而不是單個元素。

更新:另一方面,它總是值得做一些速度測試!我只是比較ismember方法如下替代方法:

N = size(bigMatrix, 1); 
Index2 = zeros(N, 1); 
for n = 1:N 
    if all(bigMatrix(n, :) == Vec) 
     Index2(n) = 1; 
    end 
end 

我的發現? bigMatrix的大小很重要!特別是,如果bigMatrix在小方面(有點用詞不當),那麼環路要快得多。只有當bigMatrix變大時,第一種方法纔是可取的。此外,結果也取決於有多少列bigMatrix以及行!我建議你測試你的應用程序的兩種方法,然後以更快的速度進行。 (編輯:這是對R2011a)

通用注:我不斷地通過Matlab的循環已經快多少,在過去幾年中得到了一驚。向量化代碼不再是它曾經的聖盃。

+0

似乎我在找什麼,謝謝!我可以在條件語句中使用它:* if(find(Index == 1)),disp('true');結束; *(如果有更優雅的方式,提示TIA) –

+1

@buli也許'如果有任何(索引); DISP( '真');結束;'(如果有任何匹配,它將顯示「真」)。此外,如果您還沒有閱讀我的答案的更新版本,我建議這樣做,因爲我發現結果很有趣。 ps很高興我可以幫助:-) –

+0

+1對於有趣的答案...你讓我檢查我的機器,線路在'ismember'和for循環之間傳遞(我是一個沉重的'ismember'用戶) – bla