Rcpp入门R代码提速方法过程

目录
  • 在RStudio中创建C++文件
  • 详细说明
  • 更多内容
  • 总结

当我们使用R进行论文模拟时,通常会涉及到许多的循环。一般比较容易的提速方法是将我们的for循环改写为apply族的方法进行向量化运算,但这个方法速度提升的有限,在真实模拟时,如果要与其他算法进行速度的比较,除非自己的算法非常出色,否则还是很难与一些成熟包中的算法相庭抗礼。

这时想要再次进行提速,有多种方法,常见的几种是将代码改写为Fortran代码,改写为C++代码抑或改写为C代码。由于Rcpp包的存在,改写为C++代码相对简单,所以后面将介绍几种常用的方法进行改写,并在R中进行调用。

在RStudio中创建C++文件

这里默认大家都安装了RStudio,我们都从里面创建一个C++文件,从这里创建有个好处,就是它直接会显示一段示例代码,我们只需在上面稍作改动即可。

首先我们在RStudio中选择:文件——新文件——C++文件,创建完一个新文件,里面是如下的内容(这里要在R中安装Rcpp包,没安装的话,点到这里RStudio会自动帮忙进行安装):

#include <Rcpp.h>
using namespace Rcpp;

// This is a simple example of exporting a C++ function to R. You can
// source this function into an R session using the Rcpp::sourceCpp
// function (or via the Source button on the editor toolbar). Learn
// more about Rcpp at:
//
//   http://www.rcpp.org/
//   http://adv-r.had.co.nz/Rcpp.html
//   http://gallery.rcpp.org/
//
// [[Rcpp::export]]
NumericVector timesTwo(NumericVector x) {
  return x * 2;
}
// You can include R code blocks in C++ files processed with sourceCpp
// (useful for testing and development). The R code will be automatically
// run after the compilation.
//
/*** R
timesTwo(42)
*/

我们按照上面的英文说明一行一行来进行理解。

详细说明

#include <Rcpp.h>
using namespace Rcpp;

这个是头文件,以及使用Rcpp命名空间。正常的一个C++代码开头两行其实也是这样,这其实非常像我们R中的library以及Python中的import,有了这个,我们就可以在代码中命名向量、矩阵、数据框等一些R中才有的对象形式,以便于R与C++中的一些内容的相互传递。

示例文件中的代码其实就是命名了一个输入与输出对象均为数值向量的函数。这个函数也非常简单:一个将向量乘以2的运算。

如果我们想在R中使用在C++文件中定义好的函数,需要在C++里面函数的上方加上// [[Rcpp::export]]。需要注意的是,一个cpp文件可以在里面定义多个函数,但只能传出一个函数。

然后我们再点击文件右上方的Source,即可将我们的函数载入进变量空间,或直接在另一个R脚本文件中运行下述命令:

Rcpp::sourceCpp('Desktop/myfun.cpp')

在示例文件中还有另一个trick,就是直接在我们的cpp文件中加上了下面这句命令:

/*** R
timesTwo(42)
*/

加上这句之后,我们Source这个文件后,可以直接测试刚刚定义的函数,看看timesTwo(42)的运行结果,平时在测试的时候可以多多使用。

更多内容

关于Rcpp里面的一些常用数据类型与常用函数,可以参考博客:Rcpp相关知识整理,里面讲的很好。这里搬运一些内容过来:

数据类型 描述
int 整数型
double 数值型
bool 布尔型(TRUE, FALSE)
String 字符型
IntegerVector 整型向量
NumericVector 数值型向量(元素的类型为double)
ComplexVector 复数向量
LogicalVector 逻辑型向量; R的逻辑型变量可以取三种值:TRUE, FALSE, NA; 而C++布尔值只有两个,true or false。如果将R的NA转化为C++中的布尔值,则会返回true。
CharacterVector 字符型向量
IntegerMatrix 整型矩阵
NumericMatrix 数值型矩阵(元素的类型为double)
LogicalMatrix 逻辑型矩阵
CharacterMatrix 字符矩阵
List 列表;lists;类似于R中列表,其元素可以使任何数据类型
DataFrame 数据框;data frames;在Rcpp内部,数据框其实是通过列表实现的
Function 函数型
Environment 环境型;可用于引用R环境中的函数、其他R包中的函数、操作R环境中的变量
RObject 可以被R识别的类型

关于对矩阵以及数据框的一些基础操作与常用函数:

操作 描述
[n] 对于向量类型或者列表,访问第n个元素。对于矩阵类型,首先把矩阵的下一列接到上一列之下,从而构成一个长列向量,并访问第n个元素。不同于R,n从0开始。
(i,j) 对于矩阵类型,访问第(i,j)个元素。不同于R,i和j从0开始。不同于向量,此处用圆括号。
List[“name1”] 访问List中名为name1的元素。
DataFrame[“name2”] 访问DataFrame中,名为name2的列。
X.size() 返回X的长度;适用于向量或者矩阵,如果是矩阵,则先向量化
X.push_back(a) 将a添加进X的末尾;适用于向量
X.push_front(b) 将b添加进X的开头;适用于向量
X.ncol() 返回X的列数
X.nrow() 返回X的行数

总结

到这里,一些关于Rcpp基础使用的相关内容就介绍的差不多了。

还有另外两个网址也非常推荐:

http://adv-r.had.co.nz/Rcpp.html

http://gallery.rcpp.org

前者里面有很多基础操作的代码,包括:向量->向量;向量->矩阵;标量->矩阵等等,里面都有示例函数及相关代码,复制到自己的cpp文件中运行并理解就很容易上手。

后者相当于一个搜索库,要使用Rcpp进行矩阵运算、并行计算、常用算法等操作,直接在里面进行搜索,就可以看到大神写的一些相应代码,同时知道该调用哪些库中的函数。

后面的博客中我们将介绍:利用RcppEigen进行矩阵运算

以上就是Rcpp入门R代码提速方法过程的详细内容,更多关于Rcpp入门R代码提速的资料请关注我们其它相关文章!

(0)

相关推荐

  • R语言基本运算的示例代码

    1.基本运算 1.1 加.减.乘.除 + - * / 在赋值中可以使用=,也可以使用<-. 1.2余数.整除 %% %/% 1.3 取绝对值 abs() 判断正负号sign() 1.4幂指数 ^ 平方根sqart () 1.5 以二为底的对数:log2() 以十为底的对数:log10() 自定义底的对数:log(c,base=) 自然常数e的对数:log(a,base=exp(1)) 2.向量运算 向量是有相同基本类型的元素序列,一维数组,定义向量的最常用办法是使用函数c(),它把若干个数值或字

  • 教你利用R语言测试电脑的性能

    利用R语言测试电脑的性能如何 同事新配了一个电脑,想用R语言编写一个程序,看一下电脑性能如何,让我写个代码测试一下. 我能怎么样,我也不懂如何测试电脑啊,那就计算一下矩阵的运算吧.因为我理解的电脑运行性能就是矩阵计算了. 编写代码 rm(list=ls()) set.seed(123) # 设置矩阵的行数 n = 10000 # 生成一个矩阵 value = rnorm(n*n, 10,3) mat = matrix(value,n,n) # 测试电脑性能 system.time({ # 矩阵求

  • R语言多线程运算操作(解决R循环慢的问题)

    已经大半年没有更新博客了..最近都跑去写分析报告半年没有R 这次记录下关于R循环(百万级以上)死慢死慢的问题,这个问题去年就碰到过,当时也尝试过多线程,but failed......昨天试了下,终于跑通了,而且过程还挺顺利 step1 先查下自己电脑几核的,n核貌似应该选跑n个线程,线程不是越多越好,线程个数和任务运行时间是条开口向下的抛物线,最高点预计在电脑的核数上. detectCores( )检查当前电脑可用核数 我的是4所以step2选的是4 library(parallel) cl.

  • 大数据分析R语言RStudio使用超详细教程

    RStudio是用于R编程的开源工具.如果您对使用R编程感兴趣,则值得了解RStudio的功能.它是一种灵活的工具,可帮助您创建可读的分析,并将您的代码,图像,注释和图解保持在一起. 在此大数据分析R语言RStudio使用教程文章中,我们将介绍RStudio免费版本的一些最佳功能:RStudio Desktop.我们收集了一些RStudio的重要技巧,窍门和快捷方式,可快速将您变成RStudio高级用户! 1.在窗口窗格之间快速导航 RStudio窗格可让您访问有关项目的重要信息.知道如何在窗格

  • Rcpp入门R代码提速方法过程

    目录 在RStudio中创建C++文件 详细说明 更多内容 总结 当我们使用R进行论文模拟时,通常会涉及到许多的循环.一般比较容易的提速方法是将我们的for循环改写为apply族的方法进行向量化运算,但这个方法速度提升的有限,在真实模拟时,如果要与其他算法进行速度的比较,除非自己的算法非常出色,否则还是很难与一些成熟包中的算法相庭抗礼. 这时想要再次进行提速,有多种方法,常见的几种是将代码改写为Fortran代码,改写为C++代码抑或改写为C代码.由于Rcpp包的存在,改写为C++代码相对简单,

  • iOS汇编入门教程之在Xcode工程中嵌入汇编代码的方法

    简介 上一篇文章ARM64汇编基础中介绍了汇编在iOS开发中的应用以及ARM汇编基础知识,本文将介绍在C或Objective-C构成的工程中如何嵌入汇编代码. 注意 在调试ARM汇编时,Xcode的Build对象必须为真机,如果对象为模拟器则是x86汇编. 内联汇编 汇编与C间接通信 在函数中可以直接插入汇编代码来影响函数的运行逻辑,使用的语法为编译指令 __asm__ ,注意插入汇编有可能会被编译器忽略,因此需要加入 __volatile__ 修饰符保证汇编代码有效. 下面给出一个简单的例子,

  • 通过numba模块给Python代码提速的方法详解

    简介:numba是Anaconda公司开发的针对Python的开源JIT编译器,用于提供Python版CPU和GPU编程,速度比原生Python快数十倍.numba是第三方库,可以在运行时将Python代码编译为本地机器指令,而不会强制大幅度的改变普通的Python代码,使得在部分场景下执行Python的效率得到飞速的提升. 工作原理对比: Python文件执行过程 1..py文件通过解释器转化为虚拟机可以执行的字节码(.pyc):字节码在虚拟机上执行,得到结果. 2.字节码是一种只能运行在虚拟

  • PHP代码重构方法漫谈

    本文实例分析了PHP代码重构方法.分享给大家供大家参考,具体如下: 随着 PHP 从一种简单的脚本语言转变为一种成熟的编程语言,一个典型的 PHP 应用程序的代码库的复杂性也随之增大.为了控制对这些应用程序的支持和维护,我们可以使用各种测试工具来自动化该流程.其中一种是单元测试,它允许您直接测试所编写代码的正确性.然而,通常遗留代码库是不适合进行这种测试的.本文将介绍对包含常见问题的 PHP 代码的重构策略,以便简化使用流行的单元测试工具进行测试的过程,同时减少改进代码库的依赖性. 简介 回顾

  • 调用其他python脚本文件里面的类和方法过程解析

    这篇文章主要介绍了调用其他python脚本文件里面的类和方法过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 问题描述: 自己编写了若干个Python脚本. 在testC.py里面需要调用testA.py和testB.py里面的若干类和方法.要怎么办? 需要都打包.安装,再去调用吗? 其实不必那么麻烦. 这里有个前提,testA.py, testB.py, testC.py在同级目录下. 如果不在同级目录,后面会补充介绍如何把路径包含过来

  • 10个python爬虫入门基础代码实例 + 1个简单的python爬虫完整实例

    本文主要涉及python爬虫知识点: web是如何交互的 requests库的get.post函数的应用 response对象的相关函数,属性 python文件的打开,保存 代码中给出了注释,并且可以直接运行哦 如何安装requests库(安装好python的朋友可以直接参考,没有的,建议先装一哈python环境) windows用户,Linux用户几乎一样: 打开cmd输入以下命令即可,如果python的环境在C盘的目录,会提示权限不够,只需以管理员方式运行cmd窗口 pip install

  • Python入门学习Python流处理过程

    目录 Faust是一个流处理库 将kafka流中的思想移植到Python中 agent是一个async def的函数,因此它还可以异步执行其他操作 使用Kafka topic作为"预写日志" Faust支持任何类型的流数据 Faust是静态类型的 Faust简介 高可用性 分布式的 快速 灵活性 安装 绑定 下载并从源文件中安装 使用开发版本 常见问题 Faust是一个流处理库 将kafka流中的思想移植到Python中 它被用于Robinhood去构建高性能的分布式系统和实时数据通道

  • 让代码整洁、过程清晰的BASH Shell编程技巧

    这是我写BASH程序的招式.这里本没有什么新的内容,但是从我的经验来看,人们爱滥用BASH.他们忽略了计算机科学,而从他们的程序中创造的是"大泥球"(译注:指架构不清晰的软件系统). 在此我告诉你方法,以保护你的程序免于障碍,并保持代码的整洁. 一.不可改变的全局变量 1.尽量少用全局变量 2.以大写命名 3.只读声明 4.用全局变量来代替隐晦的$0,$1等 在我的程序中常使用的全局变量: 复制代码 代码如下: readonly PROGNAME=$(basename $0) read

  • 史上最简单的MyBatis动态SQL入门示例代码

    假如有如下的关于书籍基本信息的表: DROP DATABASE IF EXISTS `books`; CREATE DATABASE `books`; USE books; DROP TABLE IF EXISTS `book`; CREATE TABLE `book` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(128) DEFAULT NULL, `author` varchar(64) DEFAULT NULL, `pres

  • PHP实现动态执行代码的方法

    本文实例讲述了PHP实现动态执行代码的方法.分享给大家供大家参考,具体如下: 这里介绍的PHP动态执行,即在页面上直接输入代码,点击执行,返回执行结果 方法很简单,主要使用了: $newfunc = create_function('', $code); 函数来实现. 代码如下: <?php $code = 'return "no code!";'; if (isset($_POST['code']) && $_POST['code'] != '') { $cod

随机推荐