r - 创建对称矩阵的最有效方法

标签 r loops

我有以下矩阵/数据框:

> e
  V1 V2 V3 V4 V5
1  0  2  3  4  5
2  0  0  6  8 10
3  0  0  0 12 15
4  0  0  0  0 20
5  0  0  0  0  0

在这种情况下,N = 5(行数=列数)。我想在此对称矩阵中填写缺失的值(e [1,2] = e [2,1]等)。有没有一种最有效的方法来填充缺失值(在我的情况下,矩阵大小是否很大)?有没有比嵌套循环更好的方法?

最佳答案

为了完整起见,我也想展示一下这种技术。如果矩阵的下部(对角线下方)填充了值,则转置的加法将不起作用,因为它会将它们添加到矩阵的上部。

使用Matrix包,我们可以创建一个稀疏的Matrix,如果创建一个对称的大矩阵,则需要更少的内存,甚至可以加快速度。

为了从矩阵e创建一个对称的稀疏矩阵,我们将执行以下操作:

library(Matrix)
rowscols <- which(upper.tri(e), arr.ind=TRUE)
sparseMatrix(i=rowscols[,1],    #rows to fill in
             j=rowscols[,2],    #cols to fill in
             x=e[upper.tri(e)], #values to use (i.e. the upper values of e)
             symmetric=TRUE,    #make it symmetric
             dims=c(nrow(e),nrow(e))) #dimensions

输出:
5 x 5 sparse Matrix of class "dsCMatrix"

[1,] .  2  3  4  5
[2,] 2  .  6  8 10
[3,] 3  6  . 12 15
[4,] 4  8 12  . 20
[5,] 5 10 15 20  .

微基准测试:

让我们做一个函数,从矩阵中制作一个对称矩阵(默认情况下,将矩阵的上部复制到下部):
symmetrise <- function(mat){
  rowscols <- which(upper.tri(mat), arr.ind=TRUE)
  sparseMatrix(i=rowscols[,1], 
               j=rowscols[,2], 
               x=mat[upper.tri(mat)], 
               symmetric=TRUE, 
               dims=c(nrow(mat),ncol(mat)) )  
}

并测试:
> microbenchmark(
e + t(e),
symmetrise(e),
e[lower.tri(e)] <- t(e)[lower.tri(e)],
times=1000
)
Unit: microseconds
                                  expr      min       lq      mean   median        uq       max neval cld
                              e + t(e)   75.946   99.038  117.1984  110.841  134.9590   246.825  1000 a  
                         symmetrise(e) 5530.212 6246.569 6950.7681 6921.873 7034.2525 48662.989  1000   c
 e[lower.tri(e)] <- t(e)[lower.tri(e)]  261.193  322.771  430.4479  349.968  395.3815 36873.894  1000  b 

如您所见,symmetrise实际上比e + t(e)df[lower.tri(df)] <- t(df)[lower.tri(df)]慢得多,但是至少您有一个自动对称化矩阵的函数(默认为上半部分,并创建下半部分),并且如果您有一个大矩阵而内存是一个问题,这可能会派上用场。

P.S.无论您在矩阵中看到的.为何,都表示一个零。通过使用不同的系统,稀疏矩阵是一种“压缩”对象,使其存储效率更高。

关于r - 创建对称矩阵的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32770004/

相关文章:

python - 从python中的另一个函数结束函数中的循环

java 使用带有数组的方法

Python:迭代元组时是否保留顺序?

javascript - 遍历窗口对象中的所有项目

r - 使用 dplyr 创建多功能描述表

r - 给定一个向量 c(a1, a2, a3),如何在 R 中生成 c(a1, a2, a3, a2, a3, a3)?

r - 在 R 中的数据框的每一行中保留唯一分数

ruby - 如何在循环的帮助下创建数组

r - 如何高效快速地将大型 (6 Gb) .csv 文件导入 R,而不会导致 R REPL 崩溃?

r - 使用 dygraphs 包在 R 中创建条形图