加速R代码 Rtools与OpenBLAS区别

Rtools更多的是作为R环境在Windows上进行包编译和扩展开发的一个桥梁,而OpenBLAS则是更偏重于矩阵运算的底层库

也有助于安装和使用C/C++或Fortran等其他编程语言编写的扩展包。Rtools搭载了一套强大的GNU编译器集合,支持多种编程语言的编译。在这种背景下,如果你需要在R环境中使用C++, Fortran等编译的代码/函数,或者需要自行安装一些源代码形式的R包,那就需要Rtools来完成这项工作。

OpenBLAS则是一个开源的线性代数库,为各种深度学习、高性能计算等场景提供高效的BLAS(基础线性代数子程序)和LAPACK(线性代数函数库)接口函数实现。建立在这一基础之上,OpenBLAS帮助开发者进行高级的矩阵运算,包括矩阵乘法、向量运算等。

方式1 在RStudio中使用Rcpp Rtools 安装在C:\RBuildTools 2.8G大小。

1
install.packages("Rcpp")  library(Rcpp)自动会安装rtools

方式2 Rtools手动安装到D:\Software\R\rtools43。我c盘空间不够了。指定到d盘

下载地址https://mirrors.tuna.tsinghua.edu.cn/CRAN/bin/windows/Rtools/。 安装好后要添加系统环境变量path中

D:\Software\R\rtools43

D:\Software\R\rtools43\usr\bin

和D:\Software\R\rtools43\x86_64-w64-mingw32.static.posix\bin。 如果不指定这个 报错找不到g++ 或者手动指定下面环境变量

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
Sys.setenv(PATH = paste("D:/Software/R/rtools43/usr/bin", Sys.getenv("PATH"), sep=";"))
Sys.setenv(PATH = paste("D:/Software/R/rtools43/x86_64-w64-mingw32.static.posix/bin", Sys.getenv("PATH"), sep=";"))
#Sys.setenv(PATH = paste("D:/Software/R/rtools43/mingw_64/bin", Sys.getenv("PATH"), sep=";"))
#Sys.setenv(BINPREF = "D:/Software/R/rtools43/mingw_$(WIN)/bin/")

system('gcc -v')
system('make -v')
system('g++ -v')

library(Rcpp) # 

可以导入了 不需要再安装rtools 。

创建Rcpp函数:使用cppFunction()或sourceCpp()函数。「cppFunction」允许你定义C++函数,并在R环境中直接调用

1
2
3
4
cppFunction('int add(int x, int y) {
return x + y;
}')
add(2, 3)  # Output: 5
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
library(Rcpp)
cppFunction('NumericMatrix createMatrix(int n, double value) {
  NumericMatrix mat(n, n);
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      mat(i, j) = value;
    }
  }
  return mat;
}')
#使用Rcpp创建的函数来创建6*6矩阵,并填充值为1.23

mat <- createMatrix(6, 1.23)
print(mat)


#install.packages("RcppArmadillo")
1
2
3
4
5
6
7
8
library(Rcpp)
sourceCpp("E:/lxh/mafld_血镉_睡眠障碍/matrixMultiplication.cpp") # 替换为你的cpp文件的具体路径

mat1 = matrix(1:6, nrow=3, byrow=TRUE)
mat2 = matrix(1:6, nrow=2, byrow=TRUE)

result = matrixMultiply(mat1, mat2)
print(result)

下面是进行了2x2矩阵的乘法运算。A和B分别为两个2x2矩阵,代码将他们相乘并将结果赋值给multi_result

1
2
3
4
5
6
7
8

> A <- matrix(c(1, 2, 3, 4), nrow=2)
> B <- matrix(c(5, 6, 7, 8), nrow=2)
> multi_result <- A %*% B
> print(multi_result)
     [,1] [,2]
[1,]   23   31
[2,]   34   46

下面是一个向量相加的操作。a, b为两个长度为3的一维向量,此段代码将他们相加并且将结果赋值给add_result

1
2
3
4
5
a <- c(1, 2, 3)
b <- c(4, 5, 6)
add_result <- a + b
print(add_result)
[1] 5 7 9

实现了两次矩阵乘法运算。首先,它将2x2矩阵A和B相乘得到新的2x2矩阵D,然后将D和另一个2x2矩阵C相乘得到multi_result

1
2
3
4
5
6
7
8
9
> A <- matrix(c(1, 2, 3, 4), nrow=2)
> B <- matrix(c(5, 6, 7, 8), nrow=2)
> C <- matrix(c(1, 2, 3, 4), nrow=2)
> D <- A %*% B
> multi_result <- D %*% C
> print(multi_result)
     [,1] [,2]
[1,]   85  193
[2,]  126  286

计算上述两个向量(a和b相加得到的向量c)的长度。根据输出结果,长度计算是正确的

1
2
3
4
5
6
> a <- c(1, 2, 3)
> b <- c(4, 5, 6)
> c <- a + b
> length_c <- sqrt(sum(c^2))
> print(length_c)
[1] 12.4499

计算两个向量a和b的余弦相似度。它先计算两个向量的点乘然后除以两个向量长度的乘积。根据输出结果,

1
2
3
4
5
> a <- c(1,2,3)
> b <- c(4,5,6)
> similarity <- sum(a*b) / (sqrt(sum(a^2)) * sqrt(sum(b^2)))
> print(similarity)
[1] 0.9746318

随机文章