【问题标题】:Converting cosine distance function in R to Rcpp将R中的余弦距离函数转换为Rcpp
【发布时间】:2020-09-05 22:35:58
【问题描述】:

我一直在开发一个用于单细胞 RNA-seq 分析的 R 包,我重复使用的函数之一是通过 计算给定 m 个细胞矩阵的余弦相异矩阵n 个基因。我写的函数如下:

CosineDist <- function(input = NULL) {
  if (is.null(input)) { stop("You forgot to provide an input matrix") }
  dist_mat <- as.dist(1 - input %*% t(input) / (sqrt(rowSums(input^2) %*% t(rowSums(input^2)))))
  return(dist_mat)
}

此代码适用于较小的数据集,但当我在超过 20,000 行的任何内容上运行它时,它需要很长时间,然后由于内存问题导致我的 R 会话崩溃。我相信将其移植到 Rcpp 会使其更快,内存效率更高(我知道这有点天真,但我对 C++ 的一般知识是有限的)。最后,函数的输出虽然返回时不一定是距离矩阵对象,但在生成后确实需要能够转换为该格式。

我应该如何将此函数转换为 Rcpp,然后像调用包中的任何其他函数一样调用它?或者,这是解决速度/内存问题的最佳方法吗?

【问题讨论】:

  • 它与包isa中的现有函数cosine()相比如何?
  • 这应该是 Rcpp 中的一个简单函数,但您的问题本质上是“有人可以告诉我 Rcpp 如何工作并将我的函数转换为 C++ 吗?”。这确实超出了 Stack Overflow 上的可能或主题范围。阅读good free introductory Rcpp text 更好,其中包括chapter on matrices
  • 我不知道那个包或功能,我现在就试一试。
  • 从查看源代码来看,来自isa的余弦函数也是一个纯R实现
  • 我似乎找不到这个isa 包,虽然有一个isa2 包,它没有余弦距离函数。

标签: r matrix rcpp


【解决方案1】:

很难帮助您,因为正如 cmets 指出的那样,您基本上是在寻找 Rcpp 介绍。

我会尽量给你一些提示,我在 cmets 中已经部分提到了。

通常使用 C/C++ 可以提​​供很大的加速(当然取决于任务)。但我已经达到(循环密集型,未优化代码)100 倍以上的加速。

由于添加 C++ 可能会很复杂并且有时会导致问题,因此在使用此方法之前,请检查以下内容:

1.你的 R 代码优化了吗?

你可以在这里做出很多糟糕的选择(例如,循环在 R 中很慢)。只需优化您的 R 代码,通常可以轻松实现 10 倍或更多的加速。

2。其他包中是否有更好的实现?

特别是如果它是辅助功能或通用功能,通常其他包已经实现了这些。使用“microbenchmark”包对不同的现有解决方案进行基准测试。使用另一个 R 包中的优化函数然后自己做所有事情会更容易。 (也许其他包实现已经在 C++ 中了)。我主要尝试寻找主流和流行的软件包(因为这些软件包经过了更好的测试,而且它们不太可能突然从 CRAN 中删除)。

3.分析您的代码

看看究竟是哪些部分导致了速度/内存问题。可能是您可以将部分保留在 R 中,并且只为 C++ 中的关键部分创建一个函数。或者你找到另一个包,它有一个用 C 语言实现的 R 函数,正是这个关键部分。

最后我想说,我更喜欢使用 Rcpp/C++ 而不是 C 代码。认为这是更简单的方法。对于 Rcpp 学习部分,您必须使用专门的教程(而不是 SO 问题)。

【讨论】:

  • 谢谢你,感谢你为帮助我解决这个问题所付出的所有努力。
猜你喜欢
  • 2021-08-13
  • 2014-09-30
  • 2017-07-10
  • 2017-12-12
  • 2013-02-24
  • 1970-01-01
  • 2012-02-12
  • 2021-09-09
  • 2016-12-05
相关资源
最近更新 更多