在R for循环中逐步从较小的矩阵中创建一个大矩阵

时间:2014-07-09 14:28:15

标签: r for-loop matrix

我有以下代码:

beta <- c(1, 2, 3)
X1 <- matrix(c(1, 1, 1, 1,
               0, 1, 0, 1,
               0, 0, 1, 1),
             nrow = 4,
             ncol = 3)

Z1 <- matrix(c(1, 1, 1, 1,
               0, 1, 0, 1),
             nrow = 4,
             ncol = 2)

Z2 <- matrix(c(1, 1, 1, 1,
               0, 1, 0, 1),
             nrow = 4,
             ncol = 2)

library(MASS)
    S1 <- mvrnorm(70, mu = c(0,0), Sigma = matrix(c(10, 3, 3, 2), ncol = 2))
    S2 <- mvrnorm(40, mu = c(0,0), Sigma = matrix(c(10, 4, 4, 2), ncol = 2))

z <- list()
y <- list()

for(j in 1:dim(S1)[1]){
    for(i in 1:dim(S2)[1]){
        z[[i]] <- X1 %*% beta+Z1 %*% S1[j,]+Z2 %*% S2[i,]+matrix(rnorm(4, mean = 0 , sd = 0.27), nrow = 4)
        Z <- unname(do.call(rbind, z))
    }
    y[[j]] <- Z
    Y <- unname(do.call(rbind, y))
}

X14x3Z1Z24x2矩阵。因此,每次调用X1 %*% beta+X2 %*% S1[j,]+X2 %*% S2[i,]+matrix(rnorm(4, mean = 0 , sd = sigma), nrow = 4)时,它都会输出4x1矩阵。到目前为止,我将所有这些值存储在两个列表的内部和外部循环中,然后调用rbind()将它们转换为矩阵。有没有办法直接将它们存储在矩阵中?

1 个答案:

答案 0 :(得分:2)

如果您依赖apply函数和向量回收,则可以避免使用列表。我把你的方程分解成了它的部分。 (我希望我能准确地解释它!)

Mb <- as.vector(X1 %*% beta)

M1 <- apply(S1,1,function(x) Z1 %*% x )

M2 <- apply(S2,1,function(x) Z2 %*% x ) + Mb

Mout <- apply(M1,2,function(x) M2 + as.vector(x))

as.vector(Mout) + rnorm(length(Mout), mean = 0 , sd = 0.27)

因为随机数在矩阵乘法后添加(即不参与任何计算),你可以将它们放在最后。

另请注意,您不能将较小的矩阵添加到较大的矩阵中,但如果您先将其作为矢量,则R将根据需要进行回收。因此,当Mb(长度为4的向量)被添加到具有4行和n列的矩阵中时,它将被回收n次。