可以将列表中相同的元素声明放在外层循环中,减少重复声明。例如:
#include
using namespace Rcpp;
// 嵌套循环
// 在内层循环中重复声明相同的Rcpp列表元素
// 需要优化
// [[Rcpp::export]]
NumericVector nestedLoopWithRepeatedListElements(NumericMatrix x, NumericMatrix y) {
int n = x.nrow(), m = y.ncol();
NumericVector ans(n);
for(int i = 0; i < n; i++) {
Rcpp::List tmp(m); // 重复声明
for(int j = 0; j < m; j++) {
tmp[j] = NumericVector(m); // 重复声明
}
for(int j = 0; j < m; j++) {
for(int k = 0; k < m; k++) {
tmp[j][k] = x(i, j) * y(k, j); // 计算
}
}
for(int j = 0; j < m; j++) {
ans[i] += sum(tmp[j]); // 累加
}
}
return ans;
}
// 优化后的代码
// 在外层循环中声明列表元素,避免重复声明
// [[Rcpp::export]]
NumericVector nestedLoopWithOptimizedListElements(NumericMatrix x, NumericMatrix y) {
int n = x.nrow(), m = y.ncol();
NumericVector ans(n);
Rcpp::List tmp(m); // 声明列表元素
for(int j = 0; j < m; j++) {
tmp[j] = NumericVector(m); // 声明列表元素
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
for(int k = 0; k < m; k++) {
tmp[j][k] = x(i, j) * y(k, j); // 计算
}
}
for(int j = 0; j < m; j++) {
ans[i] += sum(tmp[j]); // 累加
}
}
return ans;
}