【问题标题】:assign new matrix values based on row and column index vectors根据行和列索引向量分配新的矩阵值
【发布时间】:2016-02-19 00:10:27
【问题描述】:

这里是 MatLab 的新手(R2015a,Mac OS 10.10.5),希望找到解决这个索引问题的方法。

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

A = zeros(3, 2)

0 0
0 0
0 0

我想改变 A(1, 1) = 1, and A(2, 2) = 1, and 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

【问题讨论】:

标签: matlab indexing


【解决方案1】:

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

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

因此

A(idx) = 1 % or b

对大矩阵的 5 次测试(约 5 秒的操作)表明它比 sub2ind 快 20%。

还有一个n维问题的代码here

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-06
        • 1970-01-01
        • 2015-11-28
        • 1970-01-01
        • 2016-06-13
        • 2011-11-02
        • 2018-03-01
        • 1970-01-01
        相关资源
        最近更新 更多