我有一个带有像素数据的多维矩阵。前两个是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应该删除尾随的单一维度。
答案 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或更早版本。