Rcpp:将两个 NumericVectors 相乘,同时对其中一个进行子集化
Rcpp: Multiply two NumericVectors while subsetting one of them
我有两个 NumericVectors
A
和 B
。预先对向量 B
进行子集化时,以下乘法工作正常:
NumericVector B_sub = B[A - 1];
NumericVector res = A * B_sub;
当我尝试做的时候
NumericVector res = A * B[A - 1];
它产生错误
invalid operands to binary expression ('NumericVector' (aka 'Vector<14>') and 'SubsetProxy<14, PreserveStorage, 14, true,
Rcpp::sugar::Minus_Vector_Primitive<14, true, Rcpp::Vector<14,
PreserveStorage> > >')
我想这是 C++ 中的常见错误类型。我是一名与 R 和 python 有关的经济学学生,但 C++ 对我来说是一个新世界。
那么为什么使用 Rcpp 语法糖这个操作无效呢?有没有一种方法可以使用类型转换或类似的东西?
这是一个可复制的 myFun.cpp 文件:
#include <Rcpp.h>
using namespace std;
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector myFun(NumericVector B) {
NumericVector A = wrap(seq_len(B.size()));
NumericVector B_sub = B[A - 1];
NumericVector res = A * B_sub;
// NumericVector res = A * B[A - 1];
return res;
}
和 R-Code 使用 myFun
:
library(Rcpp)
sourceCpp("myFun.cpp")
myFun(1:10)
您可以使用 as<NumericVector>()
。创建以下 "myFun.cpp":
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector myFun(NumericVector B) {
NumericVector A = wrap(seq_len(B.size()));
NumericVector res = A * as<NumericVector>(B[A - 1]);
return res;
}
/*** R
myFun(1:10)
*/
然后来源并查看结果:
library(Rcpp)
sourceCpp("myFun.cpp")
> myFun(1:10)
[1] 1 4 9 16 25 36 49 64 81 100
我有两个 NumericVectors
A
和 B
。预先对向量 B
进行子集化时,以下乘法工作正常:
NumericVector B_sub = B[A - 1];
NumericVector res = A * B_sub;
当我尝试做的时候
NumericVector res = A * B[A - 1];
它产生错误
invalid operands to binary expression ('NumericVector' (aka 'Vector<14>') and 'SubsetProxy<14, PreserveStorage, 14, true, Rcpp::sugar::Minus_Vector_Primitive<14, true, Rcpp::Vector<14, PreserveStorage> > >')
我想这是 C++ 中的常见错误类型。我是一名与 R 和 python 有关的经济学学生,但 C++ 对我来说是一个新世界。
那么为什么使用 Rcpp 语法糖这个操作无效呢?有没有一种方法可以使用类型转换或类似的东西?
这是一个可复制的 myFun.cpp 文件:
#include <Rcpp.h>
using namespace std;
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector myFun(NumericVector B) {
NumericVector A = wrap(seq_len(B.size()));
NumericVector B_sub = B[A - 1];
NumericVector res = A * B_sub;
// NumericVector res = A * B[A - 1];
return res;
}
和 R-Code 使用 myFun
:
library(Rcpp)
sourceCpp("myFun.cpp")
myFun(1:10)
您可以使用 as<NumericVector>()
。创建以下 "myFun.cpp":
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector myFun(NumericVector B) {
NumericVector A = wrap(seq_len(B.size()));
NumericVector res = A * as<NumericVector>(B[A - 1]);
return res;
}
/*** R
myFun(1:10)
*/
然后来源并查看结果:
library(Rcpp)
sourceCpp("myFun.cpp")
> myFun(1:10)
[1] 1 4 9 16 25 36 49 64 81 100