元素操作-MATLAB

元素操作-MATLAB,matlab,matrix,Matlab,Matrix,我在MATLAB中有一个矩阵,假设: a = [ 89 79 96 72 51 74 94 88 87 69 47 78 ] 我想从每个元素中减去其列的平均值,然后除以列的标准偏差。我怎样才能在不使用循环的情况下实现任何其他矩阵呢 谢谢您可以使用repmat使平均/std向量与原始矩阵大小相同,然后使用如下直接计算: [rows, cols] = size(a); %#to get the number of rows avgc= repmat(a

我在MATLAB中有一个矩阵,假设:

a = [
  89  79  96  
  72  51  74  
  94  88  87  
  69  47  78
]
我想从每个元素中减去其列的平均值,然后除以列的标准偏差。我怎样才能在不使用循环的情况下实现任何其他矩阵呢


谢谢

您可以使用
repmat
使平均/std向量与原始矩阵大小相同,然后使用如下直接计算:

[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;
编辑:


从a来看,解决方案速度更快,占用内存更少(请参见acai答案)。对于中等大小的矩阵,我个人更喜欢使代码更易于阅读和调试的repmat(对我来说)。

如果您的版本支持
bsxfun
(可能是这种情况,除非您有非常旧的matlab版本),您应该使用它,它比
repmat
快得多,并且占用的内存也少得多。 您可以这样做:
result=bsxfun(@rdivide,bsxfun(@减号,a,mean(a)),std(a))

您还可以使用统计工具箱中的函数:

result = zscore(a)

事实上,它在下面调用BSXFUN,但小心不要除以零标准偏差(您可以自己查看源代码:
editzscore

我不同意使用BSXFUN更难阅读或调试!事实上,这两种用法最好在前面加一条注释,描述您正在做什么。注释不会花时间执行。与调试所节省的时间相比,它们的编写成本很低,而且当您明年需要更改代码时,或者当您需要修改从上周被crosstown巴士撞倒的家伙那里继承的代码时,它们的编写成本也很低。@woodchips因此被称为“我个人更喜欢”。这是主观的,我编辑了我的答案来强调这一点。我的观点是,在任何情况下,使用注释使代码可读,在这种情况下,没有任何有效的理由(除了纯粹的惯性)使用低效的旧样式。学习使用更好的表单作为一种习惯将改进您的代码。通过使用
repmat
,可以清楚地知道“广播”的是哪个维度(使用numpy术语)。我只能想到一种比bsxfun更易读的方法,但正如@woodchips所说的,您可以随时使用注释。但对于matlab的新手ppl,
repmat
迫使您考虑要扩展哪些维度,因此与bsxfun类似的问题相比,这是一个更好的练习: