基于行和列索引向量分配新的矩阵值

时间:2015-11-17 14:55:54

标签: matlab indexing

MatLab的新功能(R2015a,Mac OS 10.10.5),并希望找到解决此索引问题的方法。

我想基于一个行索引向量和一个列索引来更改大型二维矩阵的值。举个简单的例子,如果我有一个3 x 2的零矩阵:

A = zeros(3, 2)

0 0
0 0
0 0

我想改变A(1,1)= 1,A(2,2)= 1,A(3,1)= 1,这样A现在

1 0
0 1
1 0

我想用向量来表示行和列索引:

rows = [1 2 3];
cols = [1 2 1];

有没有办法在没有循环的情况下执行此操作?请记住,这是一个需要在非常大的2D矩阵上工作的玩具示例。对于额外的功劳,我是否还可以包含一个向量,指示要插入哪个值,而不是将其固定为1?

我的循环方法很简单,但很慢:

for i = 1:length(rows)

    A(rows(i), cols(i)) = 1;

end

3 个答案:

答案 0 :(得分:4)

sub2ind可以提供帮助,

A = zeros(3,2)
rows = [1 2 3];
cols = [1 2 1];

A(sub2ind(size(A),rows,cols))=1
A =

     1     0
     0     1
     1     0

使用向量'插入'

b = [1,2,3];
A(sub2ind(size(A),rows,cols))=b

A =

     1     0
     0     2
     3     0

答案 1 :(得分:1)

我在检查sub2ind的速度时在网上找到了这个答案。

idx = rows + (cols - 1) * size(A, 1);

因此

A(idx) = 1 % or b

对大矩阵进行5次测试(约5秒操作)显示它比sub2ind快20%。

还存在n维问题的代码here

答案 2 :(得分:0)

你所拥有的基本上是一个稀疏的矩阵定义。因此,sub2ind的替代方法是sparse。它将创建一个稀疏矩阵,使用full将其转换为完整矩阵。

A=full(sparse(rows,cols,1,3,2))