Rcpp中的NumericMatrix

时间:2018-10-03 17:26:23

标签: rcpp

enter image description here我正在Rstudio中编写代码,该代码在Rcpp中使用NumericVector和NumericMatrix。 我对NumericVectors没任何问题,但是当我要构造或调用NumericMatrix时,会收到警告(如下例所示)。 我的代码可以正常工作,但是由于我不了解警告的原因,因此我担心稍后可能会引起一些问题,而我却没有意识到它们。 如果有人帮助我了解这些警告的含义以及我做错的事情,我将不胜感激。

//[[Rcpp::plugins(cpp11)]]
#include <Rcpp.h>
#include <string>
#include <iostream>
using namespace Rcpp;
using namespace std;

// [[Rcpp::export]]
int sim( const NumericVector v1,
     const NumericMatrix m1)
{
  double a = v1[1];     // no warning
  double b = m1(1,1);   // no matching for call to object of type 'const NumericVector' (aka 'const Matrix<14>')
  NumericMatrix c;
  c = NumericMatrix(10,20);    //no matching constructor for initialization of 'NumericMatrix' (aka 'const Matrix<14>')

  std::cout<<"a= "<<a<<", b= "<<b<<", c(1,1)= "<<c(1,1)<<std::endl;
  return 0;
}

要运行此代码,请输入sim.cpp,定义v1和v2,然后调用sim。

library(Rcpp)
v1 <- c(1,2,3)
m1 <- matrix(c(11,22,33,44,55,66),nrow = 2)
sourceCpp("sim.cpp")
sim(v1,m1)

您将看到

[1]a= 2, b= 44, c(1,1)= 0

这是正确的答案,但我仍然有警告。

1 个答案:

答案 0 :(得分:1)

我无法复制此内容。我明白了

R> library(Rcpp)
R> sourceCpp("~/tmp/so52632570.cpp")

R> v1 <- c(1,2,3)

R> m1 <- matrix(c(11,22,33,44,55,66),nrow = 2)

R> sim(v1,m1)
a= 2, b= 44, c(1,1)= 0
[1] 0
R>

使用此清理的较小版本的代码:

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
int sim( const NumericVector v1, const NumericMatrix m1) {
  double a = v1[1];   
  double b = m1(1,1); 
  NumericMatrix c = NumericMatrix(10,20); 
  std::cout<<"a= "<<a<<", b= "<<b<<", c(1,1)= "<<c(1,1)<<std::endl;
  return 0;
}

/*** R
v1 <- c(1,2,3)
m1 <- matrix(c(11,22,33,44,55,66),nrow = 2)
sim(v1,m1)
*/

如果您需要有关错误或警告的帮助,则拥有minimally complete verifiable example会有所帮助。

此问题仍未通过测试。