【问题标题】:Using random matrix in the loop (R)在循环中使用随机矩阵 (R)
【发布时间】:2020-10-20 19:29:33
【问题描述】:

我正在尝试使用循环为随机矩阵创建特征值间距的经验直方图。看起来很简单,但到目前为止还没有工作......我收到这个错误:“M[k]

    x <- rnorm(1000,0,1)
    y <- rnorm(1000,0,1/2)
    z <- rnorm(1000,0,1)
    M <- matrix(0,2,2)
    a <- rep(0,1000)
    b <- rep(0,1000)
    s <- rep(0,1000)
    for(k in 1:1000){
    M[k] =(c(x[k],y[k],y[k],z[k]))
    temp = eigen(M[k])$value
    a[k] <- max(temp)
    b[k] <- min(temp)
    s[k] <- a[k]-b[k]
    }

【问题讨论】:

    标签: r loops math matrix


    【解决方案1】:

    如果您只对创建s 感兴趣,则可以通过使用sapply 而不是循环来简化代码。您为每次迭代创建矩阵 M 并返回最大和最小特征值之间的差。这将使您的向量 s 没有所有中间变量。

    set.seed(69) # Makes the example reproducible
    
    x <- rnorm(1000, 0, 1)
    y <- rnorm(1000, 0, 1/2)
    z <- rnorm(1000, 0, 1)
      
    s <- sapply(seq(1000), function(k) {
      M <- matrix(c(x[k], y[k], y[k], z[k]), 2, 2)
      max(eigen(M)$value) - min(eigen(M)$value)
    })
    
    hist(s)
    

    你甚至可以摆脱x, y, z,如果你只是在你去采样:

    set.seed(69) # Makes the example reproducible
    
    s <- sapply(seq(1000), function(k) {
      M <- matrix(c(rnorm(1), rep(rnorm(1, 0, 1/2), 2), rnorm(1)), 2, 2)
      max(eigen(M)$value) - min(eigen(M)$value)
    })
    
    hist(s)
    

    【讨论】: