下午
一、并行计算
参考 【效率提升】R语言并行计算 - 知乎 (zhihu.com) ,使用 foreach 包进行并行计算:
先查看计算机可用核数:使用命令 detectCores()。
下面的命令用来计算矩阵 M 每行的标准差:
library(foreach)
library(doParallel)
n <- nrow(M) # 取出M的行数
df <- data.frame(rowname_m = rownames(M), sd_m = matrix(nrow = n, ncol = 1)) # 创建一个数据框来存储标准差计算结果
func1 <- function(u) {
sd(M[u,])
}
cl <- makeCluster(6) # 开始并行计算
registerDoParallel(cl)
x <- foreach(u=1:n, .combine='rbind') %dopar% func1(u)
# 循环范围是1到n,实行func1的运算,并行计算的结果返回到x中,以行的形式合并计算结果,x的类型为"matrix" "array"。
# 还可以使用system.time({ x <- foreach(...) %dopar% ...})来查看运行时间。
df$cv[1:n] <- x # 将x的结果赋给df数据框
print(df[1:5,1:2]) # 查看df的前5行
stopCluster(cl) # 结束并行计算
上面的程序是可以运行成功的。
但是在成功之前遇到过报错“类别为'closure'的对象不可以取子集”:参考 R语言显示“类别为'closure'的对象不可以取子集”怎么办呢 - CSDN文库 ,是因为可能在并行计算中对函数取子集,当时我的func1具体为 func1 <- function(u) { df$cv[u] <- sd(M[u,]) } ,所以报错,去掉函数内赋值的命令,只运行计算sd(M[u,])的命令就可以了。
二、并行计算的可视化进度条
参考 可视化添加进度条(R语言) - 知乎 (zhihu.com) ,写得非常详细,有普通计算也有并行计算。
晚上
终于写完整个函数了。
R中创建对称矩阵的方法:参考 R语言中矩阵变为对称矩阵的两种方法_r语言生成对称矩阵-CSDN博客 ,
# 将矩阵A转换为对称矩阵
# lower.tri(A)是取A的下三角位置的逻辑值
A[lower.tri(A)] <- t(A)[lower.tri(A)]