如何沿阵列的某个维度执行操作?

Dev*_*-iL 3 optimization matlab vectorization slice multidimensional-array

我有一个包含5个3×4切片的3D数组,定义如下:

rng(3372061);
M = randi(100,3,4,5);
Run Code Online (Sandbox Code Playgroud)

我想收集有关数组的一些统计信息:

  • 每列中的最大值.
  • 每行的平均值.
  • 每个切片内的标准偏差.

这很简单,使用循环,

sz = size(M);
colMax = zeros(1,4,5);
rowMean = zeros(3,1,5);
sliceSTD = zeros(1,1,5);

for indS = 1:sz(3)
  sl = M(:,:,indS);
  sliceSTD(indS) = std(sl(1:sz(1)*sz(2)));
  for indC = 1:sz(1)
    rowMean(indC,1,indS) = mean(sl(indC,:));
  end

  for indR = 1:sz(2)
    colMax(1,indR,indS) = max(sl(:,indR));
  end  
end
Run Code Online (Sandbox Code Playgroud)

但我不确定这是解决问题的最佳方法.

一个常见的模式,我注意到的文档中max,mean并且std是它们允许指定一个额外的dim输入.例如,在max:

M = max(A,[],dim)返回维度上的最大元素dim.例如,if A是矩阵,则max(A,[],2)是包含每行最大值的列向量.

如何使用此语法来简化我的代码?

Dev*_*-iL 6

在MATLAB中的许多功能允许的规范"层面上操作"在关键时刻的计算结果(几个常见的例子有:min,max,sum,prod,mean,std,size,median,prctile,bounds) -这是多维的投入显得尤为重要.如果dim未指定输入,MATLAB可以自行选择尺寸,如文档中所述; 例如max:

  • 如果A是向量,则max(A)返回最大值A.
  • 如果A是矩阵,则max(A)是包含每列最大值的行向量.
  • 如果A是多维数组,则max(A)沿着第一个大小不相等的数组维操作1,将元素视为向量.1当所有其他尺寸的尺寸保持不变时,该尺寸的尺寸变为.如果A是一个空数组,其第一个维度的长度为零,则max(A)返回一个大小相同的空数组A.

然后,使用...,dim)语法我们可以重写代码如下:

rng(3372061);
M = randi(100,3,4,5);

colMax = max(M,[],1);
rowMean = mean(M,2);
sliceSTD = std(reshape(M,1,[],5),0,2); % we use `reshape` to turn each slice into a vector
Run Code Online (Sandbox Code Playgroud)

这有几个好处:

  • 代码更容易理解.
  • 代码可能更强大,能够处理超出最初设计的输入.
  • 代码可能更快.

总之:阅读您正在使用的函数的文档并尝试不同的语法总是一个好主意,以免错过使您的代码更简洁的类似机会.