Matlab 倍频程:通过在向量中传递索引从矩阵中获取值?

Matlab 倍频程:通过在向量中传递索引从矩阵中获取值?,matlab,octave,linear-algebra,Matlab,Octave,Linear Algebra,我需要通过传递包含索引的向量V,访问/编辑n维度矩阵M中的值 让 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)许多函数通过接受包含n列的矩阵来处理n维。但是,许多其他人要求您传递N个参数。这就是(将下标索引转换为线性索引)的情况,您需要它来解决您的特定问题: octave> M = randi (9, 3

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


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)

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

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维的主要技巧是理解以及如何理解。使用像您这样的2D示例(但忽略您的
v1
v2
废话——您应该使用矩阵
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

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

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维的主要技巧是理解以及如何理解。使用像您这样的2D示例(但忽略您的
v1
v2
废话——您应该使用矩阵
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

如果
n
确实没有修复,使用功能使用
sub2ind
是不够的。在没有for循环的情况下处理
n
的诀窍是创建一个单元格数组,该数组可用于创建一个逗号分隔的列表。@Dan如何在
sub2ind()
中将向量作为参数传递。ie
sub2ind([3,3],V1)
不起作用<代码>v1=[2,1]
@shadowfox唯一的方法是将其转换为一个单元格数组,然后转换为一个逗号分隔的列表,如Carandraugh的回答中所示。如果
n
确实不固定,那么使用
sub2ind
函数是不够的。在没有for循环的情况下处理
n
的诀窍是创建一个单元格数组,该数组可用于创建一个逗号分隔的列表。@Dan如何在
sub2ind()
中将向量作为参数传递。ie
sub2ind([3,3],V1)
不起作用<代码>v1=[2,1]
@shadowfox唯一的方法是将其转换为一个单元格数组,然后转换为一个逗号分隔的列表,就像Carandraug的答案一样