RcppArrayFire 将矩阵行作为 af::array 输入传递
RcppArrayFire passing a matrix row as af::array input
在这个简单的示例中,我想按行对矩阵进行子集化并将其传递给另一个 cpp 函数;该示例通过首先将输入数组传递给另一个函数来演示它的工作原理。
#include "RcppArrayFire.h"
using namespace Rcpp;
af::array theta_check_cpp( af::array theta){
if(*theta(1).host<double>() >= 1){
theta(1) = 0;
}
return theta;
}
// [[Rcpp::export]]
af::array theta_check(RcppArrayFire::typed_array<f64> theta){
const int theta_size = theta.dims()[0];
af::array X(2, theta_size);
X(0, af::seq(theta_size)) = theta_check_cpp( theta );
X(1, af::seq(theta_size)) = theta;
// return X;
Rcpp::Rcout << " works till here";
return theta_check_cpp( X.row(1) );
}
/*** R
theta <- c( 2, 2, 2)
theta_check(theta)
*/
您用来创建 X
的 constructor 有一个数据类型参数 ty
,默认为 f32
。因此 X
使用 32 位浮点数,您不能从中提取 64 位主机指针。要么使用
af::array X(2, theta_size, f64);
使用 64 位双精度数创建数组,或通过
提取 32 位主机指针
if(*theta(1).host<float>() >= 1){
...
在这个简单的示例中,我想按行对矩阵进行子集化并将其传递给另一个 cpp 函数;该示例通过首先将输入数组传递给另一个函数来演示它的工作原理。
#include "RcppArrayFire.h"
using namespace Rcpp;
af::array theta_check_cpp( af::array theta){
if(*theta(1).host<double>() >= 1){
theta(1) = 0;
}
return theta;
}
// [[Rcpp::export]]
af::array theta_check(RcppArrayFire::typed_array<f64> theta){
const int theta_size = theta.dims()[0];
af::array X(2, theta_size);
X(0, af::seq(theta_size)) = theta_check_cpp( theta );
X(1, af::seq(theta_size)) = theta;
// return X;
Rcpp::Rcout << " works till here";
return theta_check_cpp( X.row(1) );
}
/*** R
theta <- c( 2, 2, 2)
theta_check(theta)
*/
您用来创建 X
的 constructor 有一个数据类型参数 ty
,默认为 f32
。因此 X
使用 32 位浮点数,您不能从中提取 64 位主机指针。要么使用
af::array X(2, theta_size, f64);
使用 64 位双精度数创建数组,或通过
提取 32 位主机指针if(*theta(1).host<float>() >= 1){
...