(mxn)行列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 ];
Qのどの行が(すべての要素に対して)指定された行rと同一であるかを示す(長さmの)論理ベクトルを取得する最も簡単な方法は何ですか?
上記のサンプルケースでは、
[ 1 0 0 1 1 0 ];
(mxn)行列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 ];
Qのどの行が(すべての要素に対して)指定された行rと同一であるかを示す(長さmの)論理ベクトルを取得する最も簡単な方法は何ですか?
上記のサンプルケースでは、
[ 1 0 0 1 1 0 ];
1行で使用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の結果が各行に沿って個別にすべてtrueであるかどうかを計算します。したがって、次のように返されます。
>> all(ans,2)'
ans =
1 0 0 1 1 0
'
そして、ええ、あなたの望む行出力に一致する転置演算子もあります
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
より簡単な方法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)'