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.例如,ifA是矩阵,则max(A,[],2)是包含每行最大值的列向量.
如何使用此语法来简化我的代码?
在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)
这有几个好处:
总之:阅读您正在使用的函数的文档并尝试不同的语法总是一个好主意,以免错过使您的代码更简洁的类似机会.