【问题标题】:Repeating a simple algorithm for matrices in R?在 R 中重复一个简单的矩阵算法?
【发布时间】:2017-10-04 18:54:49
【问题描述】:

我试图通过创建第一部分来避免重复一些简单的计算。但是我想知道为什么我没有得到与第二部分计算的相同结果(第二部分给出了正确答案)?

第一部分:

 a = matrix(c(8,11,2, 6,8,4, 4,5,6, 2,8,8), nrow = 3)   
nr = nrow(a)
nc = ncol(a)
mc = colMeans(a)
mr = rowMeans(a)
gr = mean(a)

(m = matrix(c(a[rep(1:nr, nr), rep(1:nc, each = nc)] - mr[rep(1:nr, nr)] - 
mc[rep(1:nc, each = nc)] + gr), nrow = nr, ncol = nc))     ## This is NOT correct answer !!

第二部分:

a11 <- a[1, 1] - mr[1] - mc[1] + gr
a21 <- a[2, 1] - mr[2] - mc[1] + gr
a31 <- a[3, 1] - mr[3] - mc[1] + gr
a12 <- a[1, 2] - mr[1] - mc[2] + gr
a22 <- a[2, 2] - mr[2] - mc[2] + gr
a32 <- a[3, 2] - mr[3] - mc[2] + gr
a13 <- a[1, 3] - mr[1] - mc[3] + gr
a23 <- a[2, 3] - mr[2] - mc[3] + gr
a33 <- a[3, 3] - mr[3] - mc[3] + gr
a14 <- a[1, 4] - mr[1] - mc[4] + gr
a24 <- a[2, 4] - mr[2] - mc[4] + gr
a34 <- a[3, 4] - mr[3] - mc[4] + gr

g = paste0("a", rep(1:3, 3), rep(1:4, each = 3))
(m = matrix(c(mget(g)), nr = 3, ncol = 4))             ## This is the correct answer !!

【问题讨论】:

    标签: r for-loop matrix mapply


    【解决方案1】:

    您可以使用outer 来计算差异:

    myMat <- a - outer(mr, mc, "+") + gr
    myMat
    
         [,1] [,2] [,3] [,4]
    [1,]    2    1    0   -3
    [2,]    2    0   -2    0
    [3,]   -4   -1    2    3
    

    重建 m 使其不是列表

    m = matrix(unlist(mget(g)), nr = 3, ncol = 4)
    

    现在,检查它们是否相同:

    identical(m, myMat)
    [1] TRUE
    

    【讨论】:

    • @rnorouzian 这和a[., .] - (mr[.] + mc[.]) + gr一样。
    【解决方案2】:

    可能与 R 处理矩阵的方式有关。

    m = matrix(c(1,2,3,4), nrow =2)
    

    矩阵被列填充,所以在我的例子中:

    $$ \begin{pmatrix} 1 & 3 \ 2 & 4 \end{pmatrix} $$

    如果你希望它是其他的,你可以指定这样做:

    m = matrix(c(1,2,3,4),nrow = 2, byrow = TRUE)
    

    应该可以的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-16
      • 2021-10-26
      • 1970-01-01
      • 2019-12-27
      • 2017-03-21
      相关资源
      最近更新 更多