在C ++ Rcpp中实现R函数

病房9250

我有以下R代码:

CutMatrix <- FullMatrix[, colSums( FullMatrix[-1,] != FullMatrix[-nrow( FullMatrix ), ] ) > 0]

通过查找FullMatrix中的哪些列的唯一值大于1的列,从而采用一个矩阵-FullMatrix并创建一个CutMatrix-因此将消除所有具有相同值的列。我想知道是否可以使用Rcpp加快大型矩阵的速度,但是我不确定做到这一点的最佳方法-是否存在轻松实现此目的的甜味方式(例如,通过遍历cols并计数唯一值的数量),或者如果我不得不使用STL中更复杂的内容。

我以为可能是下面的事情是一个开始(我还没有完全弄清楚)-试图在R函数的colSums大括号之间进行操作,但是我不认为我在设置子对象矩阵正确,因为它不起作用。

src <- '
//Convert the inputted character matrix of DNA sequences an Rcpp class.
Rcpp::CharacterMatrix mymatrix(inmatrix);

//Get the number of columns and rows in the matrix
int ncolumns = mymatrix.ncol();
int numrows = mymatrix.nrow();

//Get the dimension names
Rcpp::List dimnames = mymatrix.attr("dimnames");

Rcpp::CharacterMatrix vec1 = mymatrix(Range(1,numrows),_);
Rcpp::CharacterMatrix vec2 = mymatrix(Range(0,numrows-1),_); 
'

uniqueMatrix <- cxxfunction(signature(inmatrix="character"), src, plugin="Rcpp")

谢谢,本

西蒙·奥汉隆

这将返回一个LogicalVectorFALSE对于只有一个所有这些列unique的值,你可以用它来子集的[R matrix

require( Rcpp )
cppFunction('
  LogicalVector unq_mat( CharacterMatrix x ){

  int nc = x.ncol() ;
  LogicalVector out(nc);

  for( int i=0; i < nc; i++ ) {
    out[i] = unique( x(_,i) ).size() != 1 ;
    }
  return out;
}'
)

您可以像这样使用它...

#  Generate toy data
set.seed(1)
mat <- matrix( as.character(c(rep(1,5),sample(3,15,repl=TRUE),rep(5,5))),5)
     [,1] [,2] [,3] [,4] [,5]
[1,] "1"  "1"  "3"  "1"  "5" 
[2,] "1"  "2"  "3"  "1"  "5" 
[3,] "1"  "2"  "2"  "3"  "5" 
[4,] "1"  "3"  "2"  "2"  "5" 
[5,] "1"  "1"  "1"  "3"  "5"

mat[ , unq_mat(mat) ]
     [,1] [,2] [,3]
[1,] "1"  "3"  "1" 
[2,] "2"  "3"  "1" 
[3,] "2"  "2"  "3" 
[4,] "3"  "2"  "2" 
[5,] "1"  "1"  "3" 

一些基本的基准测试...

applyR <- function(y) { y[ , apply( y , 2 , function(x) length( unique(x) ) != 1L ) ] }
rcpp <- function(x) x[ , unq_mat(x) ]

require(microbenchmark)
microbenchmark( applyR(mat) , rcpp(mat) )
#Unit: microseconds
#        expr    min      lq median     uq    max neval
# applyR(mat) 131.94 134.737 136.31 139.29 268.07   100
#   rcpp(mat)   4.20   4.901   7.70   8.05  13.30   100

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从Rcpp C ++函数获取R函数args

来自分类Dev

Rcpp:将列表中的布尔值从 R 传递给采用 Rcpp::List 的 C++ 函数时出错

来自分类Dev

从同一程序包中的R代码调用Rcpp c ++函数

来自分类Dev

在C中实现strcpy函数

来自分类Dev

使用Rcpp从C ++调用用户定义的R函数

来自分类Dev

使用Rcpp从C ++调用用户定义的R函数

来自分类Dev

从Rcpp中的其他包使用C函数

来自分类Dev

在C ++中实现Matlab的eps(x)函数

来自分类Dev

Android OpenCV:C ++中的AddWeighted函数实现

来自分类Dev

在C中创建pop()函数堆栈实现

来自分类Dev

头文件中的C函数实现

来自分类Dev

C中strcat函数的递归实现

来自分类Dev

我自己的realloc函数在c中的实现

来自分类Dev

在R中调用Rcpp函数

来自分类Dev

如何使用 Rcpp 将 R 函数转换为 C++ 函数?

来自分类Dev

在C ++函数中,Rcpp对象如何传递给其他函数(通过引用或复制)?

来自分类Dev

在C ++函数中,Rcpp对象如何传递给其他函数(通过引用或复制)?

来自分类Dev

为什么在我的示例中Rcpp实现比R函数慢得多?

来自分类Dev

Rcpp-如何从Shiny中的Rcpp函数调用R函数

来自分类Dev

C实现幂函数

来自分类Dev

尝试实现C ++函数

来自分类Dev

使用Rcpp将向量或矩阵从R传递到C函数而没有本地副本?

来自分类Dev

如何在C ++ 11中实现make_unique函数?

来自分类Dev

在C ++中为Interface类实现create函数

来自分类Dev

强制子类在C ++中实现某个构造函数原型

来自分类Dev

如何使用C ++ Builder在FastReport中实现“求和”聚合函数

来自分类Dev

C ++-模板类堆栈实现中的反向函数

来自分类Dev

在C中实现函数重载的最佳方法是什么?

来自分类Dev

如何在C中实现函数查找表?

Related 相关文章

热门标签

归档