scale()R函数等效于Octave / Matlab

时间:2016-05-22 18:42:18

标签: r matlab octave

避免循环,有没有办法围绕列(或行)的平均值对数据矩阵进行居中,按标准偏差(也是逐列或逐行)缩放每个条目?

在R中这很简单:scale(data, center = T, scale = T))

但我不知道如何在Ocatave或Matlab中实现相同的基本预处理。

2 个答案:

答案 0 :(得分:4)

在Octave中,这个center()和zscore()有两个函数。中心只是减去均值,而zscore也除以sd(一种有时被称为标准化的操作)

  

center(x)

     

通过减去其平均值来居中数据。

     

如果x是向量,则减去其均值。如果x是矩阵,请对每个矩阵执行上述操作   柱。如果给出了可选参数dim,则按此操作   尺寸。

  

zscore(x,opt,dim)计算x

的Z得分      

如果x是向量,则减去其均值并除以其标准差。   如果标准偏差为零,则除以1。

     

可选参数opt确定要在何时使用的规范化   计算标准偏差并具有与之相同的定义   std。

的相应参数      

如果x是矩阵,则沿第一个非单一维度计算。   如果给出第三个可选参数dim,则按此操作   尺寸。

答案 1 :(得分:1)

单个函数没有执行此操作,但您可以使用dimstd的{​​{1}}参数来完成此操作。我们也可以使用mean将它们全部包装成一行。

bsxfun

<强>解释

使用A = rand(5, 4); % Column-wise bsxfun(@rdivide, bsxfun(@minus, A, mean(A, 1)), std(A, [], 1)) % Row-wise bsxfun(@rdivide, bsxfun(@minus, A, mean(A, 2)), std(A, [], 2)) 参数dim,我们可以计算mean每列的平均值。

A

然后我们可以使用M = mean(A, 1) 从每列中的每个值中减去均值(bsxfun)。我们需要使用@minus,因为bsxfunM1 x nColsAnRows x nCols会自动为我们播放操作。

bsxfun

然后我们想要再次使用B = bsxfun(@minus, A, M); 参数(第三个输入)来计算每列的标准偏差。

dim

并将每列除以此标准差

S = std(A, [], 1)

所以我们得到了这一切

bsxfun(@rdivide, B, S);

要执行逐行操作,我们需要做的就是将bsxfun(@rdivide, bsxfun(@minus, A, mean(A, 1)), std(A, [], 1)) 参数从1(列)切换到2(行)。