gpt4 book ai didi

c++ - 从 std::vector 到 adept::avector

转载 作者:行者123 更新时间:2023-11-30 03:22:00 26 4
gpt4 key购买 nike

我想在 R 的包中嵌入一些熟练的优化。请参阅下面的最小示例。我需要将 x(和 b)的值传递给该函数。默认情况下,它们以 Rcpp:NumericVector 的形式出现,这很容易转换为 std::vector 或 double 组,例如

std::vector<double> inx_std(inx.begin(),inx.end());
double* inx_d = inx_std.data();

但是,我无法将其传递给 vector a。 avector a = inx_d 不起作用。我创建了一个 for 循环,一切正常,但必须有更好的方法来执行此操作。

下面的代码示例。

#include <Rcpp.h>
#include "adept_source.h"
#include <adept_arrays.h>

using namespace Rcpp;
using namespace adept;


// [[Rcpp::export]]
NumericVector run(NumericVector inx, NumericVector inb) {
int inxsize=inx.size(); // dim of gradient
NumericVector out(inxsize); // output vector

//adept main

Stack stack; // Object to store differential statements
aVector x(inxsize); // Independent variables: active vector with inxsize elements
aVector b(inxsize); // Independent variables: active vector with inxsize elements
for(int i=0; i<inxsize; i++) { // Fill vector
x[i]=inx(i);
b[i]=inb(i);
}

stack.new_recording(); // Clear any existing differential statements

//function to be differentiated
aReal J = sum(log(x)/log(b)); // Compute dependent variable: L3-norm in this case


//adept main
J.set_gradient(1.0); // Seed the dependent variable
stack.reverse(); // Reverse-mode differentiation

//return gradient from adept to R
for(int i=0; i<inxsize; i++) {
out[i]=x[i].get_gradient();
}

return out;
}

最佳答案

基于 JHBonarius 的有用评论和 Dirk 关于指针的提示,我创建了以下通过 Rcpp 在 R 中使用 adept 的最小示例:

#include <Rcpp.h>
#include <adept_source.h>
#include <adept_arrays.h>

using namespace Rcpp;
using namespace adept;


// [[Rcpp::export]]
NumericVector run(NumericVector inx, NumericVector inb, double gamma) {
int inxsize=inx.size(); // dim of gradient
NumericVector out(inxsize); // output vector

//convert inputs to adept arrays
adept::Vector inxV(inx.begin(), dimensions(inxsize) );
adept::Vector b(inb.begin(), dimensions(inxsize) );

//adept main
Stack stack; // Object to store differential statements
adept::aVector x = inxV;

stack.new_recording(); // Clear any existing differential statements

//function to be differentiated
aReal J = gamma*sum(log(x)/log(b)); // Compute dependent variable


//adept main
J.set_gradient(1.0); // Seed the dependent variable
stack.reverse(); // Reverse-mode differentiation


//return gradient from adept to R
for(int i=0; i<inxsize; i++) {
out[i]=x[i].get_gradient();
}

return out;
}

/*** R
run(1:3,rep(exp(1),3),1)
*/

解决方案的关键要素是:

(1) 创建一个 adept::Vector,使用适当的构造函数和一个指向名为 inx 的输入 Rcpp::Numericvector 的指针:

adept::Vector inxV(inx.begin(), dimensions(inxsize) )

(2) 然后可以将感兴趣的 vector (我们要为其计算偏导数)转换为“事件” vector :

adept::aVector x = inxV;

关于c++ - 从 std::vector 到 adept::avector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51574212/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com