我在C++上使用Armadillo库获得了令人喜爱的数据。程序的最终乘积是一个ucube,它是一个由无符号整数填充的立方体。运行之后,我希望将ucube加载到R,以执行一些最终的统计测试。为此,我创建了一个加载ucube返回数组的C++函数。
但这不管用!
我收到了以下警告:“B.bin中的警告:多维数据集::load():不正确的标题”,程序返回一个0x0x0数组。
为了找出原因,我制作了一个玩具C++程序,它运行得很好。它可以在没有任何问题的情况下加载立方体。
#include <iostream>
#include <armadillo>
using namespace arma;
void read_cubes(char const* A, char const* B){
cube C;
ucube D;
C.load(A, arma_binary);
D.load(B, arma_binary);
}
int main(int argc, char** argv){
cube A = randu<cube>(5,5,5);
ucube B = randi<ucube>(5,5,5, distr_param(1, 10));
A.save(argv[1], arma_binary);
B.save(argv[2], arma_binary);
read_cubes(argv[1], argv[2]);
}但我不知道为什么,在R中做同样的步骤是行不通的。为了举例说明,请以./a.out A.bin B.bin的形式运行玩具程序。它将产生Cube<double> A.bin和Cube<uword> B.bin,稍后我将提到它们。
问题
如果我用Rcpp提供了以下C++代码::sourceCpp和我尝试用read_cube("A.bin")读取Cube<double> A.bin,但如果我使用read_ucube("B.bin")对Cube<uword> B.bin执行同样的操作,则不会(我得到警告)。
#include <RcppArmadillo.h>
#include <iostream>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
arma::cube read_cube(char const* x){
arma::cube A;
A.load(x, arma::arma_binary);
return A;
}
// [[Rcpp::export]]
arma::ucube read_ucube(char const* x){
arma::ucube B;
B.load(x, arma::arma_binary);
return B;
}当然,我可以在结束Cube<uword>程序之前将Cube<double>转换为Cube<double>,但是我想知道为什么会发生这种情况,以及是否可以在RcppArmadillo中加载Cube<uword>。因为这应该是可能的,对吧?
发布于 2019-09-05 14:30:57
不幸的是,R仍然只支持32位整数,因此RcppArmadillo强制Armadillo使用32位整数。这是通过在包含armadillo头之前定义ARMA_32BIT_WORD来完成的。参见RcppArmadillo的配置这里。
您可以在Armadillo程序中使用同样的“技巧”,如下所示:
#define ARMA_32BIT_WORD
#include <armadillo>其中一个效果是ucube (Cube)将使用32位无符号整数。
完成上述操作后,重新编译Armadillo程序并再次保存ucubes。然后可以在RcppArmadillo中加载它们。
https://stackoverflow.com/questions/57802546
复制相似问题