如何在MATLAB代码中用R创建协方差矩阵?

时间:2014-08-24 05:17:46

标签: r matlab

我需要一些帮助将MATLAB代码移植到R。

下面是用于创建协方差矩阵的MATLAB代码,其中Z是一个包含17列和27行的矩阵。 ehat是一个包含27行和1列的向量。

omegahat=zeros(cols(Z),cols(Z));

for i=1:N    
    omegahat=omegahat+ehat(i)^2*Z(i,:)'*Z(i,:);   
end

如何在R中复制一个与此MATLAB代码类似的for循环?

1 个答案:

答案 0 :(得分:0)

试试这段代码。这实际上反映了MATLAB代码的作用,但我确实质疑它的效率。此外,cols不是MATLAB中定义的函数,除了SQL表。我假设您要确定列的总数?请改用size(Z,2)

在任何情况下,对于R,t表示转置​​,并且要执行矩阵乘法,您必须将*运算符封装在%符号中。就这样:

omegahat <- matrix(0,ncol(Z),ncol(Z));
for (i in 1:N) { # N is 27 I suppose?
   omegahat <- omegahat + (ehat[i]^2 * Z[i,] %*% t(Z[i,]))
}

这是对较小矩阵的小测试。假设Z是:

Z =

 1     2     3     4
 5     6     7     8
 9    10    11    12
13    14    15    16

另外,让ehat成为:

ehat = 

1   2   3   4

我也将假设N = 4


在MATLAB中,这是生成输出的代码:

Z = vec2mat(1:16, 4);
ehat = 1:4;
N = 4;

omegahat = zeros(size(Z,2), size(Z,2)); %# Note the change
for i = 1 : N    
    omegahat = omegahat + ehat(i)^2*Z(i,:)'*Z(i,:);   
end

我们得到:

omegahat =

    3534        3844        4154        4464
    3844        4184        4524        4864
    4154        4524        4894        5264
    4464        4864        5264        5664

在R中,这是生成输出的代码:

Z <- t(matrix(1:16,4,4))
ehat <- c(1,2,3,4)
N <- 4

omegahat <- matrix(0,ncol(Z),ncol(Z))
for (i in 1:N) {
   omegahat <- omegahat + (ehat[i]^2 * Z[i,] %*% t(Z[i,]))
}

我们得到:

> omegahat

     [,1] [,2] [,3] [,4]
[1,] 3534 3844 4154 4464
[2,] 3844 4184 4524 4864
[3,] 4154 4524 4894 5264
[4,] 4464 4864 5264 5664