Indexing 批量设置矩阵中的值

Indexing 批量设置矩阵中的值,indexing,octave,Indexing,Octave,问题是基于向量中包含的数据在矩阵中批量更改值 假设我有一个由零组成的矩阵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

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

假设我有一个由零组成的矩阵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
Z=#y=

1 0 0 0 0#由于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

广播在上有解释,但Scipy也有一个很好的图片。由于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

广播在上有说明,但Scipy也有一个很好的解决方案,它有漂亮的图片。

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

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
相关阅读如下:
找到了另一个不使用广播的解决方案。它也不需要零矩阵

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
相关阅读如下: