如果我有一个矩阵,请说:
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
有更好的方法吗?
答案 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;