【问题标题】:Stepwise creation of one big matrix from smaller matrices in R for-loops从 R for 循环中的较小矩阵逐步创建一个大矩阵
【发布时间】:2014-07-09 14:28:14
【问题描述】:

我有以下代码:

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() 将它们转换为矩阵。有没有办法直接将它们存储在矩阵中?

【问题讨论】:

  • 这听起来很有趣,但如果不知道 ran_sub、ran_ite 和 beta 的尺寸,我很难想象有替代方案。您能否提供一个完整的示例来产生您想要的输出?
  • 当然,请稍等。
  • 现在包含可重现的示例。
  • 仍然缺少 ran_subran_ite。我可以将它们设置为一些小整数吗?
  • 抱歉,现已修复。我刚刚将ran_subran_ite 分别替换为S1S2

标签: r for-loop matrix


【解决方案1】:

如果您依赖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 次。

【讨论】:

  • 谢谢。这是一个非常优雅的解决方案。
猜你喜欢
  • 2015-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多