首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多维均值

多维均值
EN

Stack Overflow用户
提问于 2017-08-31 15:02:59
回答 2查看 1.2K关注 0票数 1

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

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

代码语言:javascript
复制
%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

为此,我编写了一个函数:

代码语言:javascript
复制
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);

然而,

代码语言:javascript
复制
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矩阵中。

代码语言:javascript
复制
meanD(A,[3,4])
>> [7.5 7.5 ; 7.5 7.5 ; 7.5 7.5]

这个是正确的,因为它需要一个3x2x1x1矩阵,而matlab应该去掉尾随的单例尺寸。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-31 16:02:39

添加最后的reshape如下:

代码语言:javascript
复制
s = size(M_in);
s(ismember(1:ndims(M_in), D)) = 1;
M_out = reshape(M_out, s);
票数 1
EN

Stack Overflow用户

发布于 2018-09-23 12:29:48

我想指出的是,在Matlab R2018b中,上面的meanD提供的这个功能在Matlab中本地可用:

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

然而,这将不适用于Matlab R2018a或早期版本。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45984638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档