使用犰狳时无法加载犰狳立方体<uword>

Unable to load armadillo Cube<uword> when using RcppArmadillo

本文关键字:gt lt 立方体 uword 加载      更新时间:2023-10-16

我使用犰狳库在C++中预先拥有数据。程序的最终产品是一个ucube,它是一个充满无符号整数的立方体。运行后,我想将 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.binread_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>投射到Cube<double>,但我想知道为什么会发生这种情况,以及是否可以在 RcppArmadillo 中加载Cube<uword>。因为应该有可能,对吧?

不幸的是,R仍然只支持32位整数,因此RcppArmadillo强制犰狳使用32位整数。这是通过在包含犰狳头之前定义ARMA_32BIT_WORD来完成的。在此处查看RcppArmadillo的配置。

您可以在犰狳程序中应用相同的"技巧",如下所示:

#define ARMA_32BIT_WORD
#include <armadillo>

其中一个效果是ucube(Cube<uword>(将使用32位无符号整数。

完成上述技巧后,重新编译犰狳程序并再次保存ucube。然后它们可以装载到RcppArmadillo中。