代码之家  ›  专栏  ›  技术社区  ›  nickolakis

在R中矩阵中应用函数

  •  0
  • nickolakis  · 技术社区  · 3 年前

    我在R中有一个矩阵,形式如下:

         x11 x12 x13 
         x21 x22 x23 
    X =  x31 x32 x33 
    

    我在其中生成 R 作为:

     set.seed(123)
     X <- matrix(sample(15,9,T),3)
     colnames(X) <- paste0("X",1:3)
    > X
         X1 X2 X3
    [1,] 15 14  2
    [2,] 15  3  6
    [3,]  3 10 11
    

    我想生成一个新的矩阵 X_new 使用以下函数:

    xij = xij / ( w * sqrt(xii*xjj)), 
    

    哪里 w = 1 什么时候 xii=xjj w=2 什么时候 xii≠xjj 例如 (1,1)= 15 / (1*sqrt(15*15))=1 (1,2)= 14/(2*sqrt(15*3))= 1,04

    基本上对角线是 ones .我怎么能在 R 带有 apply 作用

    最终结果必须是:

             1     1.04  0.07
    X_new =  1.11     1  0.52
             0.11  0.87     1
    
    1 回复  |  直到 3 年前
        1
  •  2
  •   G. Grothendieck    3 年前

    使用 outer 如图所示:

    d <- diag(X)
    w <- 2 - outer(d, d, `==`)
    X / (w * sqrt(outer(d, d)))
    ##             X1        X2         X3
    ## [1,] 1.0000000 1.0434984 0.07784989
    ## [2,] 1.1180340 1.0000000 0.52223297
    ## [3,] 0.1167748 0.8703883 1.00000000
    

    或使用 sapply

    sapply(1:3, 
      function(j) sapply(1:3, 
        function(i) X[i,j] / ((2 - (X[i, i] == X[j, j])) * sqrt(X[i,i] * X[j, j]))))
    ##           [,1]      [,2]       [,3]
    ## [1,] 1.0000000 1.0434984 0.07784989
    ## [2,] 1.1180340 1.0000000 0.52223297
    ## [3,] 0.1167748 0.8703883 1.00000000
    

    或者使用不同的方式 外面的 :

    f <- function(i, j) X[i,j] / ((2 - (X[i, i] == X[j, j])) * sqrt(X[i,i] * X[j, j]))
    outer(1:3, 1:3, Vectorize(f))
    ##           [,1]      [,2]       [,3]
    ## [1,] 1.0000000 1.0434984 0.07784989
    ## [2,] 1.1180340 1.0000000 0.52223297
    ## [3,] 0.1167748 0.8703883 1.00000000