如何在数组的特定维度上执行操作?

3

我有一个包含五个3x4切片的三维数组,定义如下:

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

我希望能够收集关于数组的一些统计数据:

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

使用循环来完成这个任务非常简单,

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

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

我在 maxmeanstd 的文档中发现了一个常见的模式,它们允许指定额外的 dim 输入。例如,在 max 中:

M = max(A,[],dim) 返回沿着维度 dim 的最大元素。例如,如果 A 是一个矩阵,则 max(A,[],2) 是包含每行最大值的列向量。

如何使用这种语法简化我的代码?

1个回答

6

MATLAB中的许多函数允许在计算结果受其影响时指定“要操作的维度”(其中几个常见的示例包括:minmaxsumprodmeanstdsizemedianprctilebounds),这在处理多维输入时尤为重要。当未指定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

这样做有几个优点:

  • 代码更易懂。
  • 代码具有更强的鲁棒性,可以处理超出最初设计范围的输入。
  • 代码可能更快。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接