为什么要用Rcpp
算法简介
制作R包的流程与注意事项
观点1 程序员时间宝贵,有限时间写越短代码越好
观点2 学习R干嘛,cpp运行速度快,那都用cpp开发不就行了
将n×n的矩阵正交投影到n×s的低维空间,分解低维矩阵近似计算奇异值
LU分解替代QR分解进一步加速
Count Sketch替代Gaussian Sketch
提速关键在于降维与利用稀疏性
RcppArmadillo
优点 矩阵分解快、语法接近Matlab、可链接多库
缺点 稀疏矩阵支持度不强,并行能力弱
RcppEigen
优点 稀疏支持好
缺点 分解速度太慢
优点 快
缺点 不开源、与R耦合度低、配置麻烦
frSVD
│ DESCRIPTION /描述文件,涉及到依赖关系
│ frSVD.Rproj
│ NAMESPACE /添加useDynLib(mypackage),链接库载入、函数数据集全局可用
│
├─man
│ frSVD.rd /帮助文档
│
├─R
│ RcppExports.R /主文件,自动生成
│
└─src
frpca.h
frsvd.cpp
frSVD.dll /链接文件
frsvd.o
Makevars
Makevars.win /添加Rcpp中c++库的链接
RcppExports.cpp
RcppExports.o
Package: package name /表示包的名称
Type: Package /表示R-Project的类型,R包对应的为“Package”
Title: What the package does (short line) /标题,简要描述R包功能
Version: 1.0 /记录R包的版本信息
Author: Who wrote it /记录R包的作者
Maintainer: Who to complain to <yourfault@somewhere.net> /记录R包的维护者
Description: More about what it does (maybe more than one line) /详细描述R包的功能
License: GPL /表示R包的使用许可(General Public License)
Encoding: UTF-8
Imports: Rcpp, RcppArmadillo /使用的一些其他的包的名字,如这里用了RcppArmadillo
LinkingTo: Rcpp, RcppArmadillo /连接
SystemRequirements: C++11 /重点!使用Armadillo有可能需要C++11标准编译
\name{mypackage-package}
\alias{mypackage-pakage}
\docType{mypackage}
\title{what the package does(short line)}
\description{More about what it does}
\details{
\tabular{ll}{Package、Type、Version、Date、License、LazyLoad}
}
\author{who wrote it}
\value{
\item{函数返回变量}{ 返回变量类型说明}
}
\references{
Xu Fen, Yuyang Xie, Mingye Song Wenjian Yu, Jie Tang(2018). Fast Randomized PCA for Sparse Data. Proceedings of Machine Learning Research;see also https://arxiv.org/pdf/1810.06825.pdf
}
……
\name{mypackage-package}
\alias{mypackage-pakage}
\docType{mypackage}
\title{what the package does(short line)}
\description{More about what it does}
\usage{usage example}
\arguments{参数
\item{参数名}{参数解释}
}
\examples{}
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::plugins(cpp11)]]
#include "frpca.h"
#include <Rcpparmadillo.h>
#include <Rcpp.h>
#include <iostream>
using namespace Rcpp;
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
RcppExport SEXP frSVD(arma::sp_mat& X,int k,int q=5) {
frpca::frPCA fsvd(X,k,q);
return Rcpp::List::create(
Rcpp::Named("d") = fsvd.singularValues(),
Rcpp::Named("u") = fsvd.matrixU(),
Rcpp::Named("v") = fsvd.matrixV(),
Rcpp::Named("niter") = (q-1)/2,
Rcpp::Named("rank") = k);
}
麻烦,需要大量严格测试以及对包详尽的描述。
(这些描述将存储在 vignettes文件夹中,可在主项目目录中创建该文件夹) 模拟测试并记录后,进入Build > Build Source Package 路径创建源码包。 在https://cran.r-project.org/submit.html提交源代码包
较容易(gitHub是一个面向开源及私有软件项目的托管平台)
在 GitHub 上发布包最简单的方法是创建一个新的仓库,然后将主文件夹的内容上传至该仓库
devtools::install_github("llijiajun/frSVD")
[1] Xu Fen, Yuyang Xie, Mingye Song Wenjian Yu, Jie Tang. Fast Randomized PCA for Sparse Data. Proceedings of Machine Learning Research 80:1-16,2018.
[2] N. Halko, P. G. Martinsson, and J. A. Tropp. Finding structure with randomness: Probabilistic algorithms for constructing approximate matrix decompositions. SIAM Review, 53(2):217–288, 2011.
[5] 德克·埃德比特尔著,寇强 张晔译. Rcpp: R与C++的无缝整合