-2

嗨,我是 rcpp 新手并计算两个变量的内积,但收到以下代码的错误“inner_product 未在此范围内声明”:

#include <math.h>
#include <RcppCommon.h>
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]

using namespace Rcpp;
// [[Rcpp::export]]
NumericVector polynomial_kernel(NumericVector x, NumericMatrix Y, double scale = 1, double offset = 
1, int d=1){

  int n = Y.nrow();
  NumericVector kernel(n);

  for (int j = 0; j < n; j++){
    NumericVector v = Y( j,_ );
    double crossProd =innerProduct(x,v);
    kernel[j]= pow((scale*crossProd+offset),2); 
  }
  return kernel;
}

请帮我解决这个问题。

4

1 回答 1

3

下面是实际编译的代码的更简单的修复版本。它使用犰狳类型来保持一致性,而不是调用不存在的“inner_product”例程,而是通过乘法以标准方式计算两个向量的内积。

#include <RcppArmadillo.h>      // also pulls in Rcpp.h amd cmath

// [[Rcpp::depends(RcppArmadillo)]]

// [[Rcpp::export]]
arma::vec polynomial_kernel(arma::vec x, arma::mat Y,
                            double scale = 1, double offset = 1, int d=1) {

  int n = Y.n_rows;
  arma::vec kernel(n);

  for (int j = 0; j < n; j++){
    arma::rowvec v = Y.row(j);
    double crossProd = arma::as_scalar(v * x);
    kernel[j] = std::pow((scale*crossProd+offset),2);
  }
  return kernel;
}

您的示例不是一个完整的可验证示例,因此我无法向其展示您可以提供的任何数据。在一些虚构的数据上,它似乎有效:

R> set.seed(123)
R> polynomial_kernel(runif(4), matrix(rnorm(16),4))
         [,1]
[1,] 3.317483
[2,] 3.055690
[3,] 1.208345
[4,] 0.301834
R> 
于 2019-11-20T14:23:39.920 回答