Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R与c+交互+;利用Rcpp求解大型ODE系统 我试图用C++和Rcpp加速我的R代码执行一些昂贵的任务。我的问题涉及大约100个方程组,因此任何加速计算的提示都是受欢迎的 < >我需要将C++中创建的矩阵MX导入到C++脚本中。C++脚本必须在ODE系统中使用MX行作为X0(x初始值)。_C++_R_Boost_Rcpp - Fatal编程技术网

R与c+交互+;利用Rcpp求解大型ODE系统 我试图用C++和Rcpp加速我的R代码执行一些昂贵的任务。我的问题涉及大约100个方程组,因此任何加速计算的提示都是受欢迎的 < >我需要将C++中创建的矩阵MX导入到C++脚本中。C++脚本必须在ODE系统中使用MX行作为X0(x初始值)。

R与c+交互+;利用Rcpp求解大型ODE系统 我试图用C++和Rcpp加速我的R代码执行一些昂贵的任务。我的问题涉及大约100个方程组,因此任何加速计算的提示都是受欢迎的 < >我需要将C++中创建的矩阵MX导入到C++脚本中。C++脚本必须在ODE系统中使用MX行作为X0(x初始值)。,c++,r,boost,rcpp,C++,R,Boost,Rcpp,为了简化对我的问题的解释,下面的代码基于Lorenz系统 从我的代码质量来看,我对C++(Rcpp)是新的。 为了清楚起见,我不会发布所有糟糕的测试代码,但是我真的需要你的帮助来解决这个问题 任何帮助都将非常非常感谢! 提前谢谢 #include <boost/array.hpp> #include <boost/numeric/odeint.hpp> #include <Rcpp.h> // [[Rcpp::depends(BH)]] // [[Rcpp:

为了简化对我的问题的解释,下面的代码基于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::Dependes(BH)]]
//[[Rcpp::插件(cpp11)]]
使用名称空间std;
使用名称空间boost::numeric::odeint;
双θ[]={10.000,28,2.5};
typedef boost::数组状态类型;
void lorenz(常数状态类型&x,状态类型&dxdt,双t){
dxdt[0]=θ[0]*(x[1]-x[0]);
dxdt[1]=θ[1]*x[0]-x[1]-x[0]*x[2];
dxdt[2]=-theta[2]*x[2]+x[0]*x[1];
}
结构foo{std::向量a,b,c;};
结构foo f;
//observer应该是一个函数,它为mx的每个输入行添加一个单独的输出行,对应于最后一个集成步骤。
void append_lorenz(常数状态类型&x,常数双t){
f、 a.推回(x[0]);
f、 b.推回(x[1]);
f、 c.推回(x[2]);
}
使用名称空间Rcpp;
//[[Rcpp::导出]]
数据帧callMain(NumericMatrix mx){
int n=mx.nrow();
总数值矩阵(mx);
对于(int i=0;ires我认为错误信息已经足够清楚了

state_type x = total.row(i);

Rcpp对象和
boost::array
之间没有转换,您需要开发自己的。

“你好,世界!请修复我的代码。”问题可能会在这里被关闭。你能说得更具体些吗?你必须陈述你的问题。它不编译吗?没有链接吗?结果和预期的不一样?你的问题太宽泛了。我马上看到的一件事是,您通过值传递矩阵
mx
,这导致了复制。当使用大型矩阵时,这是不好的。使用按引用传递(
numerimatrix&mx
)。此外,您正在制作该矩阵的另一份副本(
total
)。直接使用
mx
,不要复制它。@Marko:p按值使用矩阵
mx
,这会导致复制:不,这些是Rcpp中的代理对象。只复制了一个指针和一些元数据。对于我的质量问题,我真的很抱歉。我同意你的看法,我必须更具体一些。我将把我的问题集中在一个问题上,希望这个问题足够具体。