【发布时间】:2011-12-08 15:24:00
【问题描述】:
我在 MATLAB 中有一个矩阵,可以说:
a = [
89 79 96
72 51 74
94 88 87
69 47 78
]
我想从每个元素中减去其列的平均值,然后除以该列的标准差。我怎样才能以一种可以在不使用循环的情况下实现到任何其他矩阵的方式来做到这一点。
谢谢
【问题讨论】:
我在 MATLAB 中有一个矩阵,可以说:
a = [
89 79 96
72 51 74
94 88 87
69 47 78
]
我想从每个元素中减去其列的平均值,然后除以该列的标准差。我怎样才能以一种可以在不使用循环的情况下实现到任何其他矩阵的方式来做到这一点。
谢谢
【问题讨论】:
【讨论】:
您可以使用repmat 使您的平均/标准向量与原始矩阵的大小相同,然后像这样使用直接计算:
[rows, cols] = size(a); %#to get the number of rows
avgc= repmat(avg(a),[rows 1]); %# average by column, vertically replicated by number of rows
stdc= repmat(std(a),[rows 1]); %# std by column, vertically replicated by number of rows
%# Here, a, avgc and stdc are the same size
result= (a - avgc) ./ stdc;
编辑:
从mathworks blog post,bsxfun 的解决方案来看更快并且消耗更少的内存(参见 acai 答案)。对于中等大小的矩阵,我个人更喜欢 repmat,它使代码更易于阅读和调试(对我而言)。
【讨论】:
repmat,很明显哪个维度是正在“广播”的单例(使用 numpy 术语)。我只能想到一种比 bsxfun 更具可读性的方式,但正如@woodchips 所说,您始终可以使用评论。
repmat 迫使您考虑要扩展哪些维度,因此与 bsxfun 相比,这是一个更好的练习
如果您的版本支持bsxfun(除非您有非常旧的matlab 版本,否则可能是这种情况),您应该使用它,它比repmat 快得多,并且消耗的内存少得多。
你可以这样做:result = bsxfun(@rdivide,bsxfun(@minus,a,mean(a)),std(a))
【讨论】: