Matlab-使用两个索引数组在子矩阵上进行操作

时间:2018-10-01 21:58:09

标签: matlab multidimensional-array

我试图弄清楚如何使用一组通用的下标向量访问Matlab子数组(数组的一部分)。

通常,问题定义为: 给定数组索引的两个n-dim端点(均为大小nd),一个具有初始索引集(startInd),另一个具有最后一组索引(endInd),如何访问包含在两个之间的子矩阵这对索引集?

例如,我要替换为:

Mat=rand(10,10,10,10);
Mat(2:7, 1:6, 1:6, 2:8) = 1.0;

对于可以接受两个n-dim向量的任何集合的操作,该向量指定最后一个操作的索引,“抽象”表示为:

Mat=rand(10,10,10,10);
startInd=[2 1 1 2];
endInd  =[7 6 6 8];

IndexVar=???
Mat(IndexVar) = 1.0;

因此,我想使用变量或允许通用n-dim的其他通用形式来访问子矩阵Mat(2:7,1:6,1:6,2:8)。最好不要循环(因为它很慢)。

我尝试使用这种性质的东西:

% Generate each index list separately:
nDims=length(startInd);
ind=cell(nDims,1);
for j=1:nDims
    ind{j}=startInd(j):1:endInd(j);
end

% Access the matrix:
S.type = '()';
S.subs = ind;
Mat=subsasgn(Mat,S,1.0)

这似乎可以完成工作,但是速度很慢并且占用大量内存,但是可能会给别人一个主意...

1 个答案:

答案 0 :(得分:2)

如果您不介意遍历维度(应该比遍历数组条目要快得多):

indexVar = arrayfun(@(a,b) colon(a,b), startInd, endInd, 'UniformOutput', false);
Mat(indexVar{:}) = 1;

这使用arrayfun(本质上是一个循环)来创建带有索引向量的单元格数组,然后将其扩展为comma-separated list


现在,我看到了您的代码:使用相同的方法,只是用arrayfun替换了循环,并且用逗号分隔的列表允许使用更自然的索引语法而不是subsasgn