Arrays Matlab:多维矩阵单元平均的最佳方法

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)-

我使用的高维数组的维数不一致,但都包含6个以上的维数,最后3个表示XYZ中的三维空间。对于每个x,y,z索引,我希望计算该索引的平均值,在所有其他维度上折叠。我目前正在使用向量在嵌套for循环中收集这些值,并对它们求平均值,如以下代码片段集(“beta”是所讨论的多维数组):

首先,获取beta的维数

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));