Matlab 使用向量作为矩阵的索引
我正在编写一个MATLAB函数,将数据读取到一个n维数组中(可变维大小)。我需要能够访问矩阵中的特定点(例如写入或读取),但我不知道要提前指定多少索引 目前,我有一个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]->
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插件找不到它。我想我会保留答案,因为问题的标题比另一个更直接,可能更容易搜索。我想它一定是在某个时候被问过的,但从标题中我什么也看不到。你们俩的回答都很好。我想会有这样简单的事情。你能进一步解释一下吗?我不明白,但看起来这可能是一个很好的简单的解决方案