0

私はマトリックスを持っています:

A = [ 4567 345; 45 6787; 3345ナン。87 6787]

とベクトル

B = [ 4567; 45; 8976 ]

A と B を比較し、行列 B に含まれる少なくとも 1 つの数値を持たないすべての行を A で削除したいと考えています。

結果のマトリックスは次のようになります。

[ 4567   345;

  45    6787 ]

コードは次のとおりです。

idx=ismember(A(:,1:2),B); %%create a logical index in order to see if A includes elements of B

n = length(A)
for i=1:n
   if (idx(i,1)==0)& (idx(i,2)==0)
       A(i,:)=[];
   end
end 

ただし、次のエラーが発生しました。

Index of element to remove exceeds matrix dimensions.

別の解決策を試しましたが、同じエラーが発生します。

n = length(A)
for i=1:n
     if (find(idx(i,1)==0))& (find(idx(i,2)==0))
     A(i,:)=[];
     end
end 
4

2 に答える 2

2

この論理インデックス作成タスクでは、ループは必要ありません。

ismember(A,B)
ans =
     1     0
     1     0
     0     0
     0     0

必要なのは、少なくとも 1 つの一致がある行を保持することだけですany(...,2)

idx = any(ismember(A,B),2)
idx =
     1
     1
     0
     0

結果:

A(idx,:)
ans =
        4567         345
          45        6787

エラーは、ループが実行されている1:nが、マトリックスから行を削除して、実質的に より短くしていることが原因で発生しますn

于 2013-07-28T17:47:30.217 に答える
0
A = [ 4567 345; 45 6787; 3345 NaN; 87 6787]
B = [ 8976; 45; 4567 ]
z = sum(ismember(A,B)');
NewMatrix=[];
for i = 1:length(z)
    if z(i)>= 1
        newMatrix = A(i,:);
        NewMatrix=[NewMatrix;newMatrix];
    end
end
NewMatrix
于 2013-07-28T23:49:05.437 に答える