批量设置矩阵中的值

时间:2013-05-22 15:22:42

标签: 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
   1
   3

我想要的是在索引包含在向量y的相应行中的值的列中的矩阵Z中设置1。也就是说,我想要像这样的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的新手。

2 个答案:

答案 0 :(得分: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,图片很精美。

答案 1 :(得分:1)

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

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