【问题标题】:Creating a matrix based on a function in R基于 R 中的函数创建矩阵
【发布时间】:2015-06-16 01:17:53
【问题描述】:

我有一个名为 A 的对称矩阵(尺寸:12,000 X 12,000),我想根据公式创建另一个,这取决于元素的位置。解释: 我想使用以下公式创建 D 矩阵(基于 A 中的值):

Dij = 1 - (aij/sqrt(aii*ajj))

A 的一个小例子是:

A = matrix(c(1,0.5,0.4,0.3,0.2,0.5,1.1,0.5,0.4,0.3,0.4,0.5,1.2,0.5,0.6,0.3,0.4,0.5,1,0.2,0.2,0.3,0.6,0.2,1.2),ncol=5,nrow=5, byrow=T)

由于我有一个巨大的矩阵,最好的方法是什么?

【问题讨论】:

  • 在询问之前您搜索/尝试了什么?
  • 我无法立即找到一种快速或数学上优雅的方法来执行此操作,因此您可能会被applymapplysapply 中的一个卡住。如果您对 *apply 函数系列感到不满意,那么 (a) 现在是深入研究的好时机,或者 (b) for 循环可能会“正常工作”。

标签: r matrix dataframe


【解决方案1】:

这是你想要的吗?

1-cov2cor(A)

           [,1]      [,2]      [,3]      [,4]      [,5]
 [1,] 0.0000000 0.5232687 0.6348516 0.7000000 0.8174258
 [2,] 0.5232687 0.0000000 0.5648059 0.6186150 0.7388835
 [3,] 0.6348516 0.5648059 0.0000000 0.5435645 0.5000000
 [4,] 0.7000000 0.6186150 0.5435645 0.0000000 0.8174258
 [5,] 0.8174258 0.7388835 0.5000000 0.8174258 0.0000000

【讨论】:

    【解决方案2】:

    cov2cor 是可行的方法,但您可以利用 aiiajj 始终在矩阵的对角线上这一事实。

    1 - A/sqrt(outer(diag(A), diag(A), `*`))
    
    #           [,1]      [,2]      [,3]      [,4]      [,5]
    # [1,] 0.0000000 0.5232687 0.6348516 0.7000000 0.8174258
    # [2,] 0.5232687 0.0000000 0.5648059 0.6186150 0.7388835
    # [3,] 0.6348516 0.5648059 0.0000000 0.5435645 0.5000000
    # [4,] 0.7000000 0.6186150 0.5435645 0.0000000 0.8174258
    # [5,] 0.8174258 0.7388835 0.5000000 0.8174258 0.0000000
    

    【讨论】:

      【解决方案3】:

      您可以使用R 的矢量化来完成任务而无需任何显式循环:

      B <- matrix(rep(diag(A), ncol(A)), ncol(A))
      C <- matrix(rep(diag(A), ncol(A)), ncol(A), byrow= TRUE)
      D <- 1 - (A/sqrt(B*C))
      
      #which gives
      
      D
      # 
      # [,1]      [,2]      [,3]      [,4]      [,5]
      # [1,] 0.0000000 0.5232687 0.6348516 0.7000000 0.8174258
      # [2,] 0.5232687 0.0000000 0.5648059 0.6186150 0.7388835
      # [3,] 0.6348516 0.5648059 0.0000000 0.5435645 0.5000000
      # [4,] 0.7000000 0.6186150 0.5435645 0.0000000 0.8174258
      # [5,] 0.8174258 0.7388835 0.5000000 0.8174258 0.0000000
      

      【讨论】:

      • 无需预先分配D
      猜你喜欢
      • 2021-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-19
      • 2020-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多