【问题标题】:Matlab - Using two index arrays to operate on a sub-matrixMatlab - 使用两个索引数组对子矩阵进行操作
【发布时间】:2019-03-07 01:18:31
【问题描述】:

我试图弄清楚如何使用一组通用的下标向量访问 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)

这似乎完成了工作,但是非常缓慢且内存扩展,但可能会给某人一个想法......

【问题讨论】:

  • 一个eval 解决方案虽然不推荐:eval (['Mat(' sprintf('%d:%d,', [startInd;endInd]) '1) = 1.0;']);

标签: matlab multidimensional-array


【解决方案1】:

如果你不介意循环 dimensions(这应该比循环数组 entries 快得多):

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

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


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

【讨论】:

  • 你明白了!我也检查了它的速度,还不错。
猜你喜欢
  • 1970-01-01
  • 2015-07-10
  • 1970-01-01
  • 2015-06-11
  • 2016-10-02
  • 2016-06-22
  • 1970-01-01
  • 2020-04-28
  • 1970-01-01
相关资源
最近更新 更多