多维度的平均值

时间:2017-08-31 15:03:00

标签: matlab

我有一个带有像素数据的多维矩阵。前两个是x和y,然后遵循不同的维度,z和t。

目标是平均多个维度。例如,获得平均强度与z的关系图,或者使用z和时间中的平均像素值进一步计算。 如何做到这一点,同时还保持原始矩阵维度?我生成了一个例子:

%generate some demo data
A=ones([3 2 4 5]);
for ct = 1:4
    A(:,:,ct,:)=A(:,:,ct,:)*ct;
end
for ct = 2:5
    A(:,:,:,ct)=A(:,:,:,ct)*ct;
end
%t=1,z=1 => x and y all 1
%t=2,z=3 => x and y all 6

要做到这一点,我写了一个函数:

function [M_out] = meanD(M_in,D,argin)
%takes the mean over the dimensions in D
if nargin<2||isempty(D),M_out=mean(M_in);return;end
if nargin<3||isempty(argin),argin='default';end
if length(unique(D))~=length(D),error('double dimensions');end
S = size(M_in);
N = prod(S(D));
if D(end)>length(S),error('dimension does not exist');end
if length(D)==length(S),M_out=mean(M_in(:),argin);end
dims = 1:length(S);
dims = [D,dims(~ismember(dims,D))];
S=S(dims);
M_out = permute(M_in,dims); % move the requested dimensions to the beginning
M_out = reshape(M_out,[N,S(1+length(D):end)]);
M_out = mean(M_out,argin);

然而

meanD(A,[1,2])
>> average over x and y. [1 2 3 4 5; 2 4 6 8 10; 3 6 9 12 15; 4 8 12 16 20]

所以值是正确的,但是在1x4x5矩阵中。我需要它们在1x1x4x5矩阵中。

meanD(A,[3,4])
>> [7.5 7.5 ; 7.5 7.5 ; 7.5 7.5]

这一个是正确的,因为它需要是一个3x2x1x1矩阵,而matlab应该删除尾随的单一维度。

2 个答案:

答案 0 :(得分:1)

添加最终reshape,如下所示:

s = size(M_in);
s(ismember(1:ndims(M_in), D)) = 1;
M_out = reshape(M_out, s);

答案 1 :(得分:1)

我想指出的是,从Matlab R2018b开始,上述meanD提供的此功能在Matlab中本身可用:

  

M = mean(A,vecdim)根据向量vecdim中指定的维数计算平均值。例如,如果A是矩阵,则mean(A,[1 2])是A中所有元素的均值,因为矩阵的每个元素都包含在由维1和2定义的数组切片中。

但这不适用于Matlab R2018a或更早版本。