我正在尝试为矩阵的每一列取累积和.这是我在R中的代码:
testMatrix = matrix(1:65536, ncol=256);
microbenchmark(apply(testMatrix, 2, cumsum), times=100L);
Unit: milliseconds
expr min lq mean median uq max neval
apply(testMatrix, 2, cumsum) 1.599051 1.766112 2.329932 2.15326 2.221538 93.84911 10000
Run Code Online (Sandbox Code Playgroud)
我用Rcpp进行比较:
cppFunction('NumericMatrix apply_cumsum_col(NumericMatrix m) {
for (int j = 0; j < m.ncol(); ++j) {
for (int i = 1; i < m.nrow(); ++i) {
m(i, j) += m(i - 1, j);
}
}
return m;
}');
microbenchmark(apply_cumsum_col(testMatrix), times=10000L);
Unit: microseconds
expr min lq mean median uq max neval
apply_cumsum_col(testMatrix) 205.833 …Run Code Online (Sandbox Code Playgroud) 目标背景:
我需要对具有数百万行的大型 R 对象的特定单独行执行计算。这些计算涉及一系列矩阵乘法。这些计算本身经过优化,可以快速运行,并且我的代码的进一步优化需要克服快速选择我们将执行计算的行的瓶颈。
问题:
我找到的用于从 data.table 或其他 R 对象中选择特定行的每个方法的运行速度都比我在该行上执行的计算慢得多。这里有一个有点类似的问题(R中矩阵的快速子集),推荐的解决方案是在Rcpp中对矩阵本身进行计算,而不提取行。这需要我用 C++ 重写所有计算,如果有足够有效的方法在 R 中按索引对行进行子集化,我希望避免这种情况。
示例代码:
library(dplyr)
library(data.table)
data(mtcars) # for a replicable example
mtcars_data_table <- as.data.table(mtcars) # Convert to data.table
rownames(mtcars) <- seq(1, nrow(mtcars)) # Change row names to numerical index for each row
i = 1 # Set a dummy iterator variable to one to demonstrate code as it would be used inside a for loop
microbenchmark(mtcars_data_table[i,], times=10000) # The data.frame way
microbenchmark(mtcars_data_table[i], times=10000) # The …Run Code Online (Sandbox Code Playgroud)