在没有本地副本的情况下使用 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::NumericMatrix
到GLfloat *
/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);
}
在我的系统上 GLfloat
和 GLdouble
定义为:
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 可能不正确...
这是我目前正在使用两个函数执行的操作的说明。
在这两种情况下,我都在创建本地副本:std::vector<GLfloat>
或 std::vector<GLdouble>
的实例。
有没有不涉及副本的快捷方式,我可以更直接地从Rcpp::NumericMatrix
到GLfloat *
/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);
}
在我的系统上 GLfloat
和 GLdouble
定义为:
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 可能不正确...