尝试linux中R的并行计算

下午

一、并行计算

参考 【效率提升】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)]

 

今日总结

明日提醒

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值