在MATLAB中为矩阵的特定索引赋值为零

时间:2016-02-21 00:36:00

标签: matlab indices

例如:

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

但我应对的矩阵非常大,完成运行需要很长的时间。

有没有聪明的方法呢?谢谢。

2 个答案:

答案 0 :(得分:4)

试试这个:

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;

答案 1 :(得分:4)

Anton's direct solution的替代方案是基于复制的方法:

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

我猜这两种方法的效率归结为分配vs setdiff。此外,如果结果矩阵有很多零,则应考虑使用sparse矩阵。