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

Matlab 从矩阵中删除特定数字并获得新矩阵,matlab,matrix,Matlab,Matrix,例如,我有矩阵: A = [1 3 5; 2 7 3; 9 3 8]; 我想从矩阵A中删除编号3,从而获得一个新矩阵: B = [1 5; 2 7; 9 8]; 如果我试着用A=A(A~=3)简单地删除它,它只会给我一个没有数字的列向量3,但我想要一个大小完全改变的矩阵。有人知道怎么做吗 通用解决方案: B = arrayfun(@(r)(A(r,A(r,:)~=3)), 1:size(A,1), 'Uni', false)' 它输出一个单

例如,我有矩阵:

A = [1 3 5; 
     2 7 3; 
     9 3 8];
我想从矩阵
A
中删除编号
3
,从而获得一个新矩阵:

B = [1 5; 
     2 7; 
     9 8]; 
如果我试着用
A=A(A~=3)
简单地删除它,它只会给我一个没有数字的列向量
3
,但我想要一个大小完全改变的矩阵。有人知道怎么做吗

通用解决方案:

B = arrayfun(@(r)(A(r,A(r,:)~=3)), 1:size(A,1), 'Uni', false)'
它输出一个单元格数组,并且不假设每行有多少个
3
s

为了进行说明,我将把上面的行重写为For循环:

for r = 1:size(A,1)
    row = A(r,:)
    B(r) = row(row~=3)
end
如果所有行包含相等数量的3,请参阅

或者根据您的新要求从评论中选择:

A(A==3) = NaN;
或者如果你想消除不止一个数字

A(ismember(A, [2,3])) = NaN
通用解决方案:

B = arrayfun(@(r)(A(r,A(r,:)~=3)), 1:size(A,1), 'Uni', false)'
它输出一个单元格数组,并且不假设每行有多少个
3
s

为了进行说明,我将把上面的行重写为For循环:

for r = 1:size(A,1)
    row = A(r,:)
    B(r) = row(row~=3)
end
如果所有行包含相等数量的3,请参阅

或者根据您的新要求从评论中选择:

A(A==3) = NaN;
或者如果你想消除不止一个数字

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

一个备选方案,假设每行包含相同数量的
3个

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
%// 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]

注意:如果每行中的3个数不相等,请参阅中@Dan的通用解决方案

或者这里是使用
mat2cell
cellfun

代码:

A =

 1     3     5
 2     7     3
 9     3     8


out =

 1     5
 2     7
 9     8
%// 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]
结果:

A =

 1     3     5
 2     7     3
 9     3     8


out =

 1     5
 2     7
 9     8
%// 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]

一个备选方案,假设每行包含相同数量的
3个

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
%// 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]

注意:如果每行中的3个数不相等,请参阅中@Dan的通用解决方案

或者这里是使用
mat2cell
cellfun

代码:

A =

 1     3     5
 2     7     3
 9     3     8


out =

 1     5
 2     7
 9     8
%// 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]
结果:

A =

 1     3     5
 2     7     3
 9     3     8


out =

 1     5
 2     7
 9     8
%// 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]

每行是否总是有完全相同数量的
3
s?不,不一定。我只是举了一个简单的例子。实际上,我需要处理的矩阵要大得多。因此,您必须将输出存储为单元格数组,因为结果可能是每行中有不同数量的元素。每行是否总是有相同数量的
3
s?不,不一定。我只是举了一个简单的例子。实际上,我需要处理的矩阵要大得多。因此,你必须将输出存储为单元格数组,因为结果可能是每行中有不同数量的元素。正如我所说,3可以随机分布,不一定在每行中重复相同的时间,甚至不包含在每行中。我试过你的单行代码,但它给了我一个1x3单元格数组,我想要一个3x2双数组,如@Santhan获得。@user3611812是的,但这两个标准(即随机分布的
3
s和数字矩阵输出)是矛盾的。如果
A=[1,2,3;3,3,4;1,2,2]
,那么
B
应该是什么样的?问题是我有一个非正方形的250x16224矩阵,我想删除3,并将其重塑为一个新的矩阵。更困难的是,我给出的简单示例..@user3611812我假设每行的3个数相同。这就是你举的例子。否则,您需要将结果存储为单元格数组,如dan的解决方案或我的替代解决方案。你认为丹在评论中的例子会有什么结果?@user3611812那么
A(A==3)=NaN
是你的解决方案正如我所说,3可以随机分布,不一定在每行重复相同的时间,甚至不包含在每行中。我试过你的单行代码,但它给了我一个1x3单元格数组,我想要一个3x2双数组,如@Santhan获得。@user3611812是的,但这两个标准(即随机分布的
3
s和数字矩阵输出)是矛盾的。如果
A=[1,2,3;3,3,4;1,2,2]
,那么
B
应该是什么样的?问题是我有一个非正方形的250x16224矩阵,我想删除3,并将其重塑为一个新的矩阵。更困难的是,我给出的简单示例..@user3611812我假设每行的3个数相同。这就是你举的例子。否则,您需要将结果存储为单元格数组,如dan的解决方案或我的替代解决方案。你认为丹在评论中的例子会有什么结果?@user3611812所以
A(A==3)=NaN
是你的解决方案