我正在使用 Armadillo 库在 C++ 中预置数据。程序最终产品是一个立方体,它是一个用无符号整数填充的立方体。运行后,我想将 ucube 加载到 R 以执行一些最终的统计测试。为此,我制作了一个 C++ 函数来加载 ucube 返回一个数组。
但它不起作用!
我收到以下警告:“警告:Cube::load():B.bin 中的标头不正确”并且程序返回一个 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::sourceCpp 获取以下 C++ 代码并尝试Cube<double>
使用它读取 A.bin read_cube("A.bin")
,但如果我对Cube<uword>
B.bin执行相同操作read_ucube("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;
}
当然,我可以在结束 C++ 程序之前Cube<uword>
将 a 转换为 a Cube<double>
,但我想知道为什么会发生这种情况以及是否可以Cube<uword>
在 RcppArmadillo 中加载 a。因为这应该是可能的,对吧?