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