【问题标题】:Use a vector as an index to a matrix使用向量作为矩阵的索引
【发布时间】:2025-12-16 12:30:02
【问题描述】:

我正在编写一个 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的副本,尽管这个问题可能比那个情况简单一些。
  • 我知道之前一定有人问过这个问题,但在我的欺骗插件中找不到它。我想我会让答案留下来,因为问题标题比另一个更直接,可能更容易搜索。
  • 我认为它一定是在某个时候被问到的,但从标题中我什么也没看到。两位的回答都很好。我想会有这样简单的事情。

标签: matlab indexing matrix


【解决方案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{:} 创建与输入subCell{1}, subCell{2}, ... 的等价物,这与输入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;
    

    【讨论】: