使用向量作为矩阵的索引
Posted
技术标签:
【中文标题】使用向量作为矩阵的索引【英文标题】:Use a vector as an index to a matrix 【发布时间】:2011-08-19 18:08:17 【问题描述】:我正在编写一个 MATLAB 函数来将数据读入一个 n 维数组(可变维度大小)。我需要能够访问 Matrix 中的特定点(例如写入或读取它),但我不提前知道要指定多少索引。
目前我有一个 current_point
向量,我通过它迭代来指定每个索引,以及一个 max_points
向量,它指定数组的大小。因此,如果我想要一个大小为 1000×15×3 的 3 维数组,max_points = [1000 15 3]
和 current_point
从 [1, 1, 1]
迭代到 [1000, 15, 3]
([1, 1, 1]
-> [1000, 1, 1]
-> [1, 2, 1]
-> [1000, 2, 1]
->...)。我想做的是将current_point
作为矩阵的索引提供,如下所示:
output_matrix(current_point) = val
但显然像output_matrix([1 2 3]) = val
这样的东西只会设置outputmatrix(1:3) = 30
。我不能只使用虚拟变量,因为有时矩阵需要 3 个索引,有时需要 4 个,有时需要 2 个,等等,所以在这里我需要一个可变长度的向量。有没有一种简单的方法可以将向量用作索引中的点?
【问题讨论】:
这本质上是Compact MATLAB matrix indexing notation的副本,尽管这个问题可能比那个情况简单一些。 我知道之前一定有人问过这个问题,但在我的欺骗插件中找不到它。我想我会让答案留下来,因为问题标题比另一个更直接,可能更容易搜索。 我认为它一定是在某个时候被问到的,但从标题中我什么也没看到。两位的回答都很好。我想会有这样简单的事情。 【参考方案1】:使用函数sub2ind
创建linear index是这个问题的典型解决方案,如closely-related question所示。你也可以compute a linear index yourself 而不是调用sub2ind
。
但是,您的案例可能比我链接的其他问题中的案例更简单。如果您只使用 current_point
向量索引一个 single 点(即,它只是 n 维矩阵中的下标的 n 元素向量),那么您可以使用一个简单的解决方案,其中您使用函数num2cell
将current_point
转换为下标元胞数组,并使用它来创建索引comma-separated list。例如:
current_point = [1 2 3 ...]; % A 1-by-n array of subscripts
subCell = num2cell(current_point); % A 1-by-n cell array of subscripts
output_matrix(subCell:) = val; % Update the matrix point
操作subCell:
创建与输入subCell1, subCell2, ...
的等价物,这与输入current_point(1), current_point(2), ...
的等价物。
【讨论】:
【参考方案2】:我知道现在为时已晚,但对于任何会找到这个主题的人来说。对我来说最简单的方法是使用:diag(A (x(:),y(:)) )
;
不幸的是,这仅在您需要从矩阵中获取值时才有效,而不是用于更改值
【讨论】:
您能否进一步解释一下,我不明白,但看起来它可能是一个不错且简单的解决方案【参考方案3】:您可以使用sub2ind
函数从下标中获取线性索引。
示例:
A=magic(4)
A =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
selectElement=2,3; %# get the element at position 2,3 in A.
indx=sub2ind(size(A),selectElement:);
A(indx)
ans =
10
在上面的示例中,我将下标(可以是任意数量的维度)存储为cell
。如果您将其存储为矢量,只需使用num2cell()
将其转换为单元格。
您现在可以轻松地为此赋值为A(indx)=value;
。我使用了与你不同的变量来保持答案的一般性,但想法是一样的,你只需要替换变量名。
您还在帖子中提到您从(1,1,1)
循环直到某个值(1000,15,3)
并为每个点分配一个值。如果您沿着列循环,您可以用矢量化解决方案替换整个操作。
让finalElement=1000,15,3
成为循环的最后一步。和以前一样,找到线性索引为
index=sub2ind(size(A),finalElement:);
现在,如果您将在循环中分配的值存储为单个向量 values
,您可以在一个步骤中简单地将其分配为
A(1:index)=values;
【讨论】:
以上是关于使用向量作为矩阵的索引的主要内容,如果未能解决你的问题,请参考以下文章