Arrays Matlab:多维矩阵单元平均的最佳方法
我使用的高维数组的维数不一致,但都包含6个以上的维数,最后3个表示XYZ中的三维空间。对于每个x,y,z索引,我希望计算该索引的平均值,在所有其他维度上折叠。我目前正在使用向量在嵌套for循环中收集这些值,并对它们求平均值,如以下代码片段集(“beta”是所讨论的多维数组): 首先,获取beta的维数Arrays Matlab:多维矩阵单元平均的最佳方法,arrays,matlab,optimization,matrix,multidimensional-array,Arrays,Matlab,Optimization,Matrix,Multidimensional Array,我使用的高维数组的维数不一致,但都包含6个以上的维数,最后3个表示XYZ中的三维空间。对于每个x,y,z索引,我希望计算该索引的平均值,在所有其他维度上折叠。我目前正在使用向量在嵌套for循环中收集这些值,并对它们求平均值,如以下代码片段集(“beta”是所讨论的多维数组): 首先,获取beta的维数 betasdim=size(betas); 计算三维空间的大小,以及需要折叠的尺寸数。betasdim的最后3个维度是XYZ: voxdim=betasdim(length(betasdim)-
betasdim=size(betas);
计算三维空间的大小,以及需要折叠的尺寸数。betasdim的最后3个维度是XYZ:
voxdim=betasdim(length(betasdim)-2:length(betasdim));
其他一切都是要崩溃的维度
otherdims=betasdim(1:length(betasdim)-3);
有多少维度正在被折叠
numdims=length(otherdims);
使冒号向量在除XYZ以外的所有维度上折叠:
dimwildcard=repmat({':'}, 1, numdims);
初始化均值矩阵
meanbetas=repmat([NaN],voxdim);
现在可能是低效率的for-loop解决方案:
for x=1:voxdim(1)
for y=1:voxdim(2)
for z=1:voxdim(3)
voxbetas=betas(dimwildcard{:},x,y,z);%get all beta values for this xyz
voxbetas=reshape(voxbetas,1, numel(voxbetas));%reshape to vector
meanbetas(x,y,z)=nanmean(voxbetas); %average the vector and store in new array
end
end
end
请记住,我需要nanmean()在每个索引处提供一个值,除了迭代x、y、z的每个值之外,还有更快的解决方案吗?如果我理解正确,您需要的是
压缩(平均值…(平均值(betas)))
。您可以通过以下方式实现:
betas = randn(2,3,4,5,6,7); %// example data
meanbetas = betas; %// intialization
for n = 1:ndims(betas)-3
meanbetas = mean(meanbetas); %// average along first non-singleton dimension
end
meanbetas = squeeze(meanbetas); %// remove singleton dimensions
或者,您可以重塑形状,以便除最后三个维度外的所有维度都折叠为单个(第一个)维度,并且仅沿该第一个维度平均一次:
betas = randn(2,3,4,5,6,7); %// example data
N = ndims(betas); %// number of dimensions
meanbetas = squeeze(mean(reshape(betas, ...
[], size(betas,N-2), size(betas,N-1), size(betas,N)), 1));