使用vector作为matrix的索引

我正在写一个MATLAB函数来读出数据到一个n维数组(可变维度大小)。 我需要能够访问matrix中的特定点(例如,写入或读取它),但是我不知道需要指定多less个索引。

目前我有一个current_point向量,我遍历指定每个索引,并指定一个max_points向量指定数组的大小。 所以,如果我想要一个尺寸为1000×15×3, max_points = [1000 15 3]的三维数组,并且current_point[1, 1, 1] max_points = [1000 15 3] [1, 1, 1][1000, 15, 3] max_points = [1000 15 3] [1000, 15, 3][1, 1, 1] – > [1000, 1, 1] [1, 2, 1] – > [1000, 2, 1] [1, 2, 1] – > [1000, 2, 1] – > …)。 我希望能够做的是饲料current_point作为一个索引matrix像这样:

 output_matrix(current_point) = val 

但显然像output_matrix([1 2 3]) = val就会设置outputmatrix(1:3) = 30 。 我不能只是使用虚拟variables,因为有时matrix需要3个索引,其他时间4,其他时间2等,所以一个可变长度的向量真的是我需要在这里。 有一个简单的方法来使用一个向量作为索引中的点?

使用SUB2IND函数创build一个线性索引是解决这个问题的典型方法,正如这个密切相关的问题所示 。 你也可以自己计算一个线性索引,而不是调用SUB2IND 。

但是,您的情况可能比我链接到的其他问题更简单。 如果你只用current_point向量索引单个点(也就是说,它只是你的n维matrix中的下标的n元向量),那么你可以使用一个简单的解决scheme,将current_point转换为下标的单元数组使用函数NUM2CELL并使用它来创build索引的逗号分隔列表 。 例如:

 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{:}创build了键入subCell{1},subCell{2},...的等价物,这相当于inputcurrent_point(1),current_point(2),...

我知道这太晚了,但是对于任何能够find这个主题的人来说。 最简单的方法是使用: diag(A (x(:),y(:)) ) ;

不幸的是,这只有在您需要从matrix中获取值而不是用于更改值时才有效

您可以使用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; 。 我已经使用了不同于你的variables来保持答案的一般性,但想法是一样的,你只需要replacevariables名称。

你也在你的post中提到,你正在从(1,1,1)循环到某个值, (1000,15,3)并为每个点赋值。 如果您沿着列循环,则可以使用vector化解决schemereplace整个操作。

finalElement={1000,15,3}是循环的最后一步。 像以前一样,find线性索引

 index=sub2ind(size(A),finalElement{:}); 

现在,如果将循环中赋值的值存储为单个向量,则可以将其简单地分配为单个向量

 A(1:index)=values;