使用犰狳时无法加载犰狳立方体<uword>
Unable to load armadillo Cube<uword> when using RcppArmadillo
我使用犰狳库在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中。
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中