我在MATLAB中有一个矩阵,让我们说:
a = [
89 79 96
72 51 74
94 88 87
69 47 78
]
我想从每个元素中减去其列的平均值,并除以列的标准偏差。如何在不使用循环的情况下以任何其他矩阵的方式实现。
感谢
答案 0 :(得分:5)
如果您的版本支持bsxfun
(除非您有非常旧的matlab版本,可能就是这种情况),您应该使用它,它比repmat
快得多,并且消耗的内存要少得多。
您可以这样做:result = bsxfun(@rdivide,bsxfun(@minus,a,mean(a)),std(a))
答案 1 :(得分:1)
您可以使用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答案)。对于中等大小的矩阵,我个人更喜欢使代码更易于阅读和调试的代码(对我而言)。
答案 2 :(得分:1)