r - 如何加速 Rcpp 双循环
问题描述
由于我不是 C++(或 Rcpp)方面的专家,我想知道是否还有其他/更好的方法来编写下面的这个小函数,它使用 2 个 for 循环来填充基于其他 2 个矩阵的值的矩阵。
以下是一些示例数据:
library(Rcpp)
sizem <- 50000
n <- 500
k <- 5
d <- matrix(nrow = n, ncol = k, 0)
x <- matrix(nrow = n, ncol = sizem, runif(sizem*n, 0, 500))
rownames(x) <- paste0("p-",1:n)
v <- matrix(nrow = k, ncol = sizem, sample(0:300, size = sizem*k, T))
该功能目前看起来像这样:
cppFunction("
NumericMatrix compdistc(NumericMatrix d, NumericMatrix x, NumericMatrix v, int k, int n) {
NumericMatrix out = clone(d);
int i,j;
for (j=0; j < k; ++j) {
for (i=0; i < n; ++i) {
out(i,j) = sum(pow((x(i,_) - v(j,_)), 2));
}
}
return(out);
}
")
out <- compdistc(d, x, v, k, n)
这是我目前的基准:
mc <- microbenchmark(times = 10,
out = compdistc(d, x, v, k, n)
); mc
Unit: seconds expr min lq mean median uq max neval out 2.123477 2.135013 2.174556 2.148467 2.204108 2.354089 10
解决方案
推荐阅读
- json - VUE将JSON从点击函数传递到HTML模板
- javascript - 选择选择选项Javascript DOM后自动填充输入
- asp.net - 应用程序突然挂起(等待进入 .NET 锁)
- c# - 从共享 ArrayPool 中租用和返回 C# 中的多维数组的正确方法?
- botframework - 如何添加 Http 请求超时?
- .net - 无法找到 .NET Core SDK
- c++ - Qt3D - 在多视口中添加边框
- android-gradle-plugin - 如何将参数从 Gradle 插件传递给 JUnit4 测试运行器?
- sql - SQL 命令 if sum = 0 by criteria
- doctrine - Doctrine querybuilder 添加子查询更改别名