【问题标题】:Setting values in a matrix in bulk批量设置矩阵中的值
【发布时间】:2013-05-24 04:48:05
【问题描述】:

问题是关于基于向量中包含的数据的矩阵中的批量更改值。

假设我有一个 5x4 零矩阵。

octave> Z = zeros(5,4)

Z =

   0   0   0   0
   0   0   0   0
   0   0   0   0
   0   0   0   0
   0   0   0   0

还有一个长度等于Z中行数的列向量,即5。向量y中的行对应矩阵Z中的行。

octave> y = [1; 3; 2; 1; 3]

y =

   1
   3
   2
   1
   3

我想要的是在矩阵 Z 的列中设置 1,其索引作为向量 y 的相应行中的值包含。也就是说,我想要这样的 Z 矩阵:

Z =                       #  y =

   1   0   0   0          # <--  1 st column
   0   0   1   0          # <--  3 rd column
   0   1   0   0          # <--  2 nd column
   1   0   0   0          # <--  1 st column
   0   0   1   0          # <--  3 rd column

有没有简洁的方法?我知道我可以使用 y 上的循环来实现它,但我觉得 Octave 可以有更简洁的方式。我是 Octave 的新手。

【问题讨论】:

    标签: indexing octave


    【解决方案1】:

    由于 Octave 具有自动广播功能(您需要 Octave 3.6.0 或更高版本),我认为最简单的方法是使用它进行比较。方法如下

    octave> 1:5 == [1 3 2 1 3]'
    ans =
    
       1   0   0   0   0
       0   0   1   0   0
       0   1   0   0   0
       1   0   0   0   0
       0   0   1   0   0
    

    Octave manual 上解释了广播,但 Scipy 也有一个 good explanation 为它提供漂亮的图片。

    【讨论】:

      【解决方案2】:

      找到另一个不使用广播的解决方案。它也不需要零矩阵。

      octave> y = [1; 3; 2; 1; 3]
      
      octave> eye(5)(y,:)
      ans =
      
         1   0   0   0   0
         0   0   1   0   0
         0   1   0   0   0
         1   0   0   0   0
         0   0   1   0   0
      

      相关阅读: http://www.gnu.org/software/octave/doc/interpreter/Creating-Permutation-Matrices.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-06
        • 1970-01-01
        • 2021-09-26
        • 1970-01-01
        • 2017-01-28
        • 1970-01-01
        • 1970-01-01
        • 2017-12-03
        相关资源
        最近更新 更多