Matlab 使用向量作为矩阵的索引

Matlab 使用向量作为矩阵的索引,matlab,indexing,matrix,Matlab,Indexing,Matrix,我正在编写一个MATLAB函数,将数据读取到一个n维数组中(可变维大小)。我需要能够访问矩阵中的特定点(例如写入或读取),但我不知道要提前指定多少索引 目前,我有一个current_point向量,我通过它迭代指定每个索引,还有一个max_points向量,它指定数组的大小。因此,例如,如果我想要一个大小为1000×15×3的三维数组,max\u points=[1000,15,3],而当前点从[1,1,1]迭代到[1000,15,3]([1,1,1]-[1000,1,1]->[1,2,1]->

我正在编写一个MATLAB函数,将数据读取到一个n维数组中(可变维大小)。我需要能够访问矩阵中的特定点(例如写入或读取),但我不知道要提前指定多少索引

目前,我有一个
current_point
向量,我通过它迭代指定每个索引,还有一个
max_points
向量,它指定数组的大小。因此,例如,如果我想要一个大小为1000×15×3的三维数组,
max\u points=[1000,15,3]
,而
当前点
[1,1,1]
迭代到
[1000,15,3]
[1,1,1]
-
[1000,1,1]
->
[1,2,1]
->
->。我希望能够将
当前_点
作为矩阵的索引,如下所示:

output_matrix(current_point) = val
但是很明显,像
output\u matrix([1 2 3])=val这样的东西只会设置
outputmatrix(1:3)=30
。我不能只使用虚拟变量,因为有时矩阵需要3个索引,其他时间4,其他时间2,等等,所以变量长度的向量才是我真正需要的。有没有一种简单的方法可以将向量用作索引中的点?

您可以使用该函数从下标获取线性索引

示例:

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
在上面的示例中,我将下标(可以是任意数量的维度)存储为
单元格
。如果将其存储为向量,只需使用将其转换为单元格即可

您现在可以很容易地将一个值赋值为
a(indx)=value。我使用了不同于你的变量来保持答案的概括性,但是想法是一样的,你只需要替换变量名

您在帖子中还提到,您正在从
(1,1,1)
循环到某个值,
(1000,15,3)
,并为每个点指定一个值。如果沿着列循环,可以使用矢量化解决方案替换整个操作

finalElement={1000,15,3}
成为循环的最后一步。如前所述,查找线性索引为

index=sub2ind(size(A),finalElement{:});
现在,如果在循环中指定的值存储为单个向量,
values
,则只需在单个步骤中将其指定为

A(1:index)=values;
使用该函数创建一个函数是此问题的典型解决方案,如图所示。您也可以不调用
sub2ind

然而,你的情况可能比我联系到的其他问题要简单。如果您仅使用
当前_点
向量为单个点建立索引(即,它只是n维矩阵中的一个n元素下标向量),那么您可以使用一个简单的解决方案,使用函数将
当前_点
转换为下标单元格数组,并使用它创建一组索引。例如:

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),…

我知道这已经太晚了,但对于任何找到这个主题的人来说都是如此。对我来说,最简单的方法就是使用:
diag(A(x(:),y(:))


不幸的是,这只适用于需要从矩阵中获取值的情况,而不适用于更改值的情况

这本质上是的重复,尽管这个问题可能比那个情况简单一些。我知道这一定是以前问过的,但我的dupe插件找不到它。我想我会保留答案,因为问题的标题比另一个更直接,可能更容易搜索。我想它一定是在某个时候被问过的,但从标题中我什么也看不到。你们俩的回答都很好。我想会有这样简单的事情。你能进一步解释一下吗?我不明白,但看起来这可能是一个很好的简单的解决方案