我需要一些帮助将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
循环?
答案 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