在没有本地副本的情况下使用 Rcpp 将向量或矩阵从 R 传递到 C 函数?

Passing a vector or matrix from R to a C function using Rcpp without a local copy?

这是我目前正在使用两个函数执行的操作的说明。

在这两种情况下,我都在创建本地副本:std::vector<GLfloat>std::vector<GLdouble> 的实例。

有没有不涉及副本的快捷方式,我可以更直接地从Rcpp::NumericMatrixGLfloat */GLdouble *

#include <Rcpp.h>
#include <GLFW/glfw3.h>
using namespace Rcpp;

//' @export
// [[Rcpp::export("glLoadMatrixf")]]
void gl_load_matrixf(Rcpp::NumericMatrix m) {

  std::vector<GLfloat> float_v = Rcpp::as<std::vector<GLfloat> >(m);
  const GLfloat * _float_v = &float_v[0];

  glLoadMatrixf(_float_v);
}

//' @export
// [[Rcpp::export("glLoadMatrixd")]]
void gl_load_matrixd(Rcpp::NumericMatrix m) {

  std::vector<GLdouble> double_v = Rcpp::as<std::vector<GLdouble> >(m);
  const GLdouble * _double_v = &double_v[0];

  glLoadMatrixd(_double_v);
}

在我的系统上 GLfloatGLdouble 定义为:

typedef float GLfloat;
typedef double GLdouble;

并且 R 的数字数据类型始终是 double。因此,您可以直接使用 &m[0]m.begin() 来获得可转换为 GLdouble * 的内容,而无需复制数据。对于 GLfloat 这是不可能的,因为它需要(有损)转换才能从 R 使用的(64 位)double 到(32 位)float.

部分代码如图:

Sys.setenv(PKG_LIBS="-lGL -lglfw")

Rcpp::sourceCpp(code = '
#include <Rcpp.h>
#include <GLFW/glfw3.h>
using namespace Rcpp;

// [[Rcpp::export("glLoadMatrixd")]]
void gl_load_matrixd(Rcpp::NumericMatrix m) {

     const GLdouble * _double_v = &m[0];

     glLoadMatrixd(_double_v);
}
')


glLoadMatrixd(matrix(runif(10), 2, 5))

顺便说一句,我不知道这样的矩阵应该有多少维度。 2x5 可能不正确...