0
我試圖加快我的R代碼執行一些計算量很大的C++和Rcpp任務。我的問題大約涉及100個方程組,因此任何提示加速計算的提示都是受歡迎的。R通過Rcpp與C++進行交互以解決大型ODE系統
我需要的是將在R中創建的矩陣MX導入到C++腳本中。 C++腳本必須在ODE系統中使用MX的行作爲x0(x初始值)。
爲了簡化對我的問題的解釋,下面的代碼基於Lorenz系統。由於我的代碼的質量很明顯,我是C++(和Rcpp)的新手。
爲了清楚起見,我不會發布所有可怕的測試代碼,我真的需要您的幫助來嘗試解決此問題。
任何幫助將真的,真的感激! 在此先感謝。
#include <boost/array.hpp>
#include <boost/numeric/odeint.hpp>
#include <Rcpp.h>
// [[Rcpp::depends(BH)]]
// [[Rcpp::plugins(cpp11)]]
using namespace std;
using namespace boost::numeric::odeint;
double theta [] = {10.000,28,2.5};
typedef boost::array< double , 3 > state_type;
void lorenz(const state_type &x , state_type &dxdt , double t) {
dxdt[0] = theta[0] * (x[1] - x[0]);
dxdt[1] = theta[1] * x[0] - x[1] - x[0] * x[2];
dxdt[2] = -theta[2] * x[2] + x[0] * x[1];
}
struct foo { std::vector<double> a, b, c; };
struct foo f;
//observer should be a function that append a single output row for each input row of mx corresponding to the last integration step.
void append_lorenz(const state_type &x , const double t) {
f.a.push_back(x[0]);
f.b.push_back(x[1]);
f.c.push_back(x[2]);
}
using namespace Rcpp;
// [[Rcpp::export]]
DataFrame callMain(NumericMatrix mx){
int n = mx.nrow();
NumericMatrix total(mx);
for(int i = 0; i < n; ++i) {
// state_type x should be mx rows
state_type x = total.row(i); // initial conditions
const double dt =0.1;
integrate(lorenz , x , 0.0 , 1.0 , dt , append_lorenz);
}
return DataFrame::create(Named("a") = f.a, Named("b") = f.b, Named("c") = f.c);
}
/*** R
mx=matrix(1:9,3,3)
res <- callMain(mx)
print((res))
*/
我得到的錯誤是: 錯誤:轉換從 'RCPP ::矩陣< 14> ::行{又名RCPP :: MatrixRow < 14>}' 到非標量類型「爲state_type {又名升壓:: array}'要求 state_type x = total.row(i); //初始條件
_「你好,世界!請修復我的代碼。」_問題可能會在這裏關閉。你可以說得更詳細點嗎? –
你必須說明你的問題。它不編譯?不鏈接? REsult與預期不同? –
你的問題太廣泛了。我馬上看到的一件事是,你正在通過值傳遞矩陣'mx',這會導致複製。這在使用大型矩陣時很糟糕。使用引用傳遞('NumericMatrix&mx')。此外,您正在製作該矩陣的另一個副本(「總數」)。直接使用'mx',不要複製它。 –