从矩阵中删除特定数字并获得新矩阵

时间:2015-05-29 10:07:55

标签: matlab matrix

例如,我有矩阵:

A = [1 3 5; 
     2 7 3; 
     9 3 8];

我想从矩阵3中移除数字A,从而获得一个新矩阵:

B = [1 5; 
     2 7; 
     9 8]; 

如果我尝试使用A=A(A~=3)删除它,它只会给我一个没有数字3的列向量,但我想要一个具有确切更改大小的矩阵。任何人都知道如何做到这一点?

2 个答案:

答案 0 :(得分:2)

通用解决方案:

B = arrayfun(@(r)(A(r,A(r,:)~=3)), 1:size(A,1), 'Uni', false)'

输出一个单元格数组,不假设每行有3个。{/ p>

为了说明,我将上述行重写为for循环:

for r = 1:size(A,1)
    row = A(r,:)
    B(r) = row(row~=3)
end

如果您的所有行包含相同数量的3,请参阅Santhan's answer

或者根据你评论中的新要求:

A(A==3) = NaN;

或者如果你想消除多于一个数字

A(ismember(A, [2,3])) = NaN

答案 1 :(得分:2)

一个备用,假设每行包含相同数量的3's

A = [1 3 5; 2 7 3; 9 3 8];
B = A.';                   %//'
out = reshape(B(B~=3),[],size(A,1)).'

<强>结果:

A =

 1     3     5
 2     7     3
 9     3     8


out =

 1     5
 2     7
 9     8

注意:如果每行中3的数量不相等,请参阅other answer

中@Dan的通用解决方案

或者使用mat2cell&amp; cellfun

<强>代码:

%// creating cells where each cell contain one row
AC = mat2cell(A,ones(1,size(A,1)),size(A,2));

%// returning only the elements not equal to 3 in each row
out = cellfun(@(x) x(x~=3),AC,'uni',0)

<强>结果:

A =

 1     3     5     3
 2     7     3     1
 9     3     8     5


out = 

[1x2 double]
[1x3 double]
[1x3 double]