使用向量作为矩阵的索引

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 元素向量),那么您可以使用一个简单的解决方案,其中您使用函数num2cellcurrent_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;

【讨论】:

以上是关于使用向量作为矩阵的索引的主要内容,如果未能解决你的问题,请参考以下文章

矩阵运算:索引逻辑到数值比较的不对称向量

特征矩阵是不是支持向量索引?

优雅的索引到向量/矩阵的末尾

对向量矩阵中的值进行排序,输出对应的索引

如何通过C ++中的数据获得向量的索引

向量矩阵乘法、浮点向量、二进制矩阵