【发布时间】: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包,它没有余弦距离函数。