0

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

假设我有一个 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 可以有更简洁的方式。我是八度的新手。

4

2 回答 2

2

由于 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 手册中有解释,但 Scipy 也有一个很好的解释,有漂亮的图片。

于 2013-05-22T16:36:28.897 回答
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

于 2013-05-23T20:48:05.790 回答