在 MATLAB 中将零分配给矩阵的特定索引
Assign zero to specific indices of a matrix in MATLAB
例如:
a = [1 2 3; 4 5 6; 7 8 9];
b = [2 4]; %//Indices I got
如何将 a
中未在 b
中索引的每个元素设置为零以获得:
0 2 0
4 0 0
0 0 0
我尝试了 for
循环:
for i = 1:numel(a)
if i ~= b
a(i) = 0;
end
end
但是我处理的矩阵非常大,需要很长时间才能完成 运行。
有什么聪明的方法吗?谢谢。
试试这个:
a = [1 2 3; 4 5 6; 7 8 9];
b = [2 4];
a(setdiff(1:length(a(:)),b)) = 0;
更新
如@Daniel 所提议,对于大矩阵最好使用
a(setdiff(1:numel(a),b)) = 0;
的替代方法是基于复制:
a = [1 2 3; 4 5 6; 7 8 9];
b = [2 4];
atmp = a(b);
a = zeros(size(a));
a(b) = atmp; %// copy needed elements
我想这两种方法的效率归结为分配与 setdiff
。此外,如果您得到的矩阵有很多零,您或许应该考虑使用 sparse
矩阵。
例如:
a = [1 2 3; 4 5 6; 7 8 9];
b = [2 4]; %//Indices I got
如何将 a
中未在 b
中索引的每个元素设置为零以获得:
0 2 0
4 0 0
0 0 0
我尝试了 for
循环:
for i = 1:numel(a)
if i ~= b
a(i) = 0;
end
end
但是我处理的矩阵非常大,需要很长时间才能完成 运行。
有什么聪明的方法吗?谢谢。
试试这个:
a = [1 2 3; 4 5 6; 7 8 9];
b = [2 4];
a(setdiff(1:length(a(:)),b)) = 0;
更新
如@Daniel 所提议,对于大矩阵最好使用
a(setdiff(1:numel(a),b)) = 0;
a = [1 2 3; 4 5 6; 7 8 9];
b = [2 4];
atmp = a(b);
a = zeros(size(a));
a(b) = atmp; %// copy needed elements
我想这两种方法的效率归结为分配与 setdiff
。此外,如果您得到的矩阵有很多零,您或许应该考虑使用 sparse
矩阵。