这是我目前使用两个功能的说明。
在这两种情况下,我都创建一个本地副本: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可能不正确...