matlab如何使用逻辑索引删除行

时间:2013-07-28 17:18:35

标签: matlab matrix compare

我有一个矩阵:

  
    

A = [4567 345; 45 6787; 3345 NaN; 87 6787]

  

和矢量

  
    

B = [4567; 45; 8976]

  

我想比较A和B并在A中删除所有没有至少一个包含在矩阵B中的数字的行。

结果矩阵将是:

[ 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 

2 个答案:

答案 0 :(得分:2)

此逻辑索引任务中不需要循环:

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

您只需要保留与any(...,2)至少匹配的行:

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

结果:

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

错误是由于您的循环从1:n开始运行,但您要从矩阵中删除行,使其有效地短于n

答案 1 :(得分: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