Octave:通过在向量中传递索引来从矩阵中访问值?

时间:2016-04-04 12:26:19

标签: matlab octave linear-algebra

我需要通过传递包含索引的向量n来访问/编辑M维矩阵V中的值。


M = [ 1,2,3; 4,5,6; 7,8,9;];

索引向量

V1=[2,1]; V2=[1,2];

现在,M(V1)应该提供4
M(V2)应该2;

问题n未修复,我不想循环访问M(idx_1,idx_2,...idx_n)

等值

1 个答案:

答案 0 :(得分:3)

许多函数通过接受具有N列的矩阵来处理N维。但是,许多其他人要求您传递N个参数。这是sub2ind(将下标索引转换为线性索引)的情况,您需要解决您的具体问题:

octave> M = randi (9, 3)
M =

   2   9   4
   5   9   5
   2   6   4

octave> ind = sub2ind (size (M), [2 1], [1 2]) # sub2ind (dims, rows, cols, 3rd_dim, 4th_dim, ...)
ind =

   2   4

octave> M(ind)
ans =

   5   9

处理N维的主要技巧是理解comma separated lists (cs-lists)以及如何get them from cell arrays。使用像您这样的2D示例(但忽略了v1v2废话 - 你应该使用矩阵v,其中每一行都是一个点,每列都是一个维度),你能做到:

octave> v = [2 1; 1 2];
octave> ind = sub2ind (size (M), num2cell (v, 1){:})
ind =

   2
   4

octave> M(ind)
ans =

   5
   9

上面例子中唯一需要解释的是:

octave> num2cell (v, 1) # returns a cell array
ans = 
{
  [1,1] =

     2
     1

  [1,2] =

     1
     2

}
octave> num2cell (v, 1){:} # transform the cell array into a cs-list
ans =

   2
   1

ans =

   1
   2

你可以用它来真正处理N维:

octave> M = rand (9, 5, 5, 5, 5, 5);
octave> v = [5 5 5 5 5; 1 2 3 4 5; 3 2 4 4 1];
octave> ind = sub2ind (size (M), num2cell (v, 1){:});
octave> M(ind)
ans =

   0.13726
   0.14020
   0.78660

octave> [M(5, 5, 5, 5, 5); M(1, 2, 3, 4, 5); M(3, 2, 4, 4, 1)]
ans =

   0.13726
   0.14020
   0.78660