假設我有一個(m×n)矩陣Q和一個行向量r,例如,找到矩陣中的匹配行
Q = [ 1 2 3 ; 4 2 3 ; 5 6 7 ; 1 2 3 ; 1 2 3 ; 1 2 5 ];
r = [ 1 2 3 ];
什麼是獲得(長度爲m)的邏輯矢量指示哪些Q中的行是相同的(所有元素)到指定的行r的最簡單的方法?
在上面的示例情況下,這應該是
[ 1 0 0 1 1 0 ];
假設我有一個(m×n)矩陣Q和一個行向量r,例如,找到矩陣中的匹配行
Q = [ 1 2 3 ; 4 2 3 ; 5 6 7 ; 1 2 3 ; 1 2 3 ; 1 2 5 ];
r = [ 1 2 3 ];
什麼是獲得(長度爲m)的邏輯矢量指示哪些Q中的行是相同的(所有元素)到指定的行r的最簡單的方法?
在上面的示例情況下,這應該是
[ 1 0 0 1 1 0 ];
您可以使用ismember
並做到這一點在單行中:
>> ismember(Q,r,'rows')'
ans =
1 0 0 1 1 0
all(bsxfun(@eq, r, Q),2)'
bsxfun(@eq, r, Q)
比較每一行並返回與相同大小的矩陣爲Q:
>> bsxfun(@eq, r, Q)
ans =
1 1 1
0 1 1
0 0 0
1 1 1
1 1 1
1 1 0
的all
函數計算,如果bsxfun的結果都是分開的每一行。因此,它返回:
>> all(ans,2)'
ans =
1 0 0 1 1 0
,是的,也有置算'
以匹配所需的行輸出
值得注意的是,這比成員 –
更簡單的方法與repmat
:
a = [1 2 3; 4 5 6; 7 8 9];
t = [4 5 6];
[x,y] = size(a);
r = all(a==repmat(t,y,1), 2)'
的速度還要快,效率也更低,見:http://blogs.mathworks.com/loren/2008/08/04/comparing-repmat-and-bsxfun-performance/#9 –
不需要的效率是一個詛咒。編寫和理解的簡單性直接關係到更好的代碼。 – Castilho
關於'bsxfun(@eq,r,Q)''很難理解什麼?如果您通過這樣簡單的示例學習它,稍後您將在應用複雜問題時受益。 –
a = [1 1 1; 2 2 2; 3 3 3];
b = a(1:2,;);
[temp locb] = ismember(a,b,'rows');
b(locb(locb~=0),:)
ans =
1 1 1
2 2 2
與以下內容非常相關:http://stackoverflow.com/questions/6209904/find-given-row-in-a-matrix – neuronet