使用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;