MATLAB - 使行/列不在列表中,全部为0

时间:2015-10-29 05:43:31

标签: matlab matrix

如果我有一个矩阵,请说:

A = [ 0 2 4 6 
      2 0 5 7
      4 5 0 3
      6 7 3 0 ]

我希望列表中的行和列中的所有元素都等于零,我可以使用:

del_list = [2 4]
A(del_list,:) = 0
A(:,del_list) = 0

给了我:

A = [ 0 0 4 0 
      0 0 0 0
      4 0 0 0
      0 0 0 0 ]

但是如何将del_list变成keep_list并且只保留列表中的那些行和列,所以在

之前使用我的示例
keep_list = [2 4]
<do something>

A = [ 0 0 0 0 
      0 0 0 7
      0 0 0 0
      0 7 0 0 ]

我努力做到这一点的方式是这样的:

keep_list = [2 4]
n = size(A,1)
for ii = 1:n
   if ~any(keep_list==ii)
       A(ii,:) = 0;
       A(:,ii) = 0;
   end
 end

有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

制作一个新矩阵,然后输入您想要的值

B=zeros(size(A));
B(keep_list,:)=A(keep_list,:);
B(:,keep_list)=A(:,keep_list);

是的,你将有2个矩阵而不是1,这将使用额外的内存,但除非你的矩阵很大,否则大多数情况下不会出现问题,你可以随时删除A B

答案 1 :(得分:1)

您可以尝试使用Matlab的set subtraction命令从keep_list中创建del_list,并使用与原始帖子相同的技术。

keep_list = [2 4];
all_indices = 1:size(A,1);
del_list = setdiff(all_indices, keep_list);
A(del_list,:) = 0;
A(:,del_list) = 0;