2015-11-23 66 views
0

我試圖加快我的R代碼執行一些計算量很大的C++和Rcpp任務。我的問題大約涉及100個方程組,因此任何提示加速計算的提示都是受歡迎的。R通過Rcpp與C++進行交互以解決大型ODE系統

我需要的是將在R中創建的矩陣MX導入到C++腳本中。 C++腳本必須在ODE系統中使用MX的行作爲x0x初始值)。

爲了簡化對我的問題的解釋,下面的代碼基於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); //初始條件

+1

_「你好,世界!請修復我的代碼。」_問題可能會在這裏關閉。你可以說得更詳細點嗎? –

+0

你必須說明你的問題。它不編譯?不鏈接? REsult與預期不同? –

+0

你的問題太廣泛了。我馬上看到的一件事是,你正在通過值傳遞矩陣'mx',這會導致複製。這在使用大型矩陣時很糟糕。使用引用傳遞('NumericMatrix&mx')。此外,您正在製作該矩陣的另一個副本(「總數」)。直接使用'mx',不要複製它。 –

回答

0

我認爲錯誤信息已經足夠清楚了。

state_type x = total.row(i); 

Rcpp對象和boost::array之間沒有轉換,您需要開發自己的。