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

标签 matlab multidimensional-array

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

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

例如,我想替换这个:

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

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

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)

这似乎可以完成工作,但是速度非常慢并且占用内存,但可能会给某人一个想法......

最佳答案

如果您不介意循环维度(这应该比循环条目快得多):

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

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


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

关于Matlab - 使用两个索引数组对子矩阵进行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52599432/

相关文章:

matlab - matlab中的分水岭算法

python - 如何在 python 中将文本格式与没有正则表达式的字符串匹配?

ruby - 如何对二维数组求和

python - 根据两列的值选择 numpy ndarray 中的行

matlab - 修复动画的轴

matlab - 从文本文件导入并在 matlab 中创建元胞数组

multidimensional-array - 有没有办法将表单中的所有字段收集到一个二维数组中以写入 Google 表格?

java - 打印二维字符数组

javascript - 在二维数组中前后移动

c++ - 使用刷新的输入从 C++ 调用 Matlab