用R语言基于一个函数创建矩阵

3

我有一个对称矩阵(维度:12,000 X 12,000),名为A,我想基于一个公式创建另一个矩阵,该公式取决于元素的位置。为了解释: 我想使用以下公式创建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)

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


1
你在提问之前已经搜索/尝试了什么? - user3710546
我暂时看不到快速或数学优雅的解决方法,所以你可能只能使用applymapplysapply中的一个。如果你不熟悉*apply函数族,那么(a)现在是深入了解的好时机,或者(b)for循环也可以“同样有效”。 - r2evans
3个回答

5

Is that what you want?

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

3

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

2

你可以使用 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 - thelatemail

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接