我需要通过传递包含索引的向量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 个参数。这就是解决特定问题所需的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 个维度的主要技巧是了解逗号分隔列表 (cs-lists( 以及如何从单元格数组中获取它们。使用像您这样的 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