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
答案 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))