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
是否有這樣的功能/操作員,或者我需要一個循環?
我正在尋找一個快速/簡潔的方式來檢查一些矩陣是否包含給定的載體,例如:矩陣是否包含矢量?
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
是否有這樣的功能/操作員,或者我需要一個循環?
我建議以下解決方案:
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的循環已經快多少,在過去幾年中得到了一驚。向量化代碼不再是它曾經的聖盃。
似乎我在找什麼,謝謝!我可以在條件語句中使用它:* if(find(Index == 1)),disp('true');結束; *(如果有更優雅的方式,提示TIA) –
@buli也許'如果有任何(索引); DISP( '真');結束;'(如果有任何匹配,它將顯示「真」)。此外,如果您還沒有閱讀我的答案的更新版本,我建議這樣做,因爲我發現結果很有趣。 ps很高興我可以幫助:-) –
+1對於有趣的答案...你讓我檢查我的機器,線路在'ismember'和for循環之間傳遞(我是一個沉重的'ismember'用戶) – bla