元素操作 - MATLAB

时间:2011-10-16 07:53:51

标签: matlab matrix

我在MATLAB中有一个矩阵,让我们说:

a = [
  89  79  96  
  72  51  74  
  94  88  87  
  69  47  78
]

我想从每个元素中减去其列的平均值,并除以列的标准偏差。如何在不使用循环的情况下以任何其他矩阵的方式实现。

感谢

3 个答案:

答案 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)

您还可以使用统计工具箱中的ZSCORE功能:

result = zscore(a)

实际上,它在下面调用了BSXFUN,但是小心不要除以零标准差(你可以自己查看源代码:edit zscore