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

Posted

技术标签:

【中文标题】使用 RcppArmadillo 时无法加载犰狳立方体<uword>【英文标题】:Unable to load armadillo Cube<uword> when using RcppArmadillo 【发布时间】:2019-09-05 09:36:22 【问题描述】:

我正在使用 Armadillo 库在 C++ 中预置数据。程序最终产品是一个立方体,它是一个用无符号整数填充的立方体。运行后,我想将 ucube 加载到 R 以执行一些最终的统计测试。为此,我创建了一个 C++ 函数来加载 ucube 返回一个数组。

但它不起作用! 我收到以下警告:"warning: Cube::load(): wrong header in 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&lt;double&gt; A.bin 和Cube&lt;uword&gt; B.bin,我稍后会提到。

问题 如果我使用 Rcpp::sourceCpp 获取以下 C++ 代码并尝试使用 read_cube("A.bin") 读取 Cube&lt;double&gt; A.bin 它可以工作,但如果我对 Cube&lt;uword&gt; 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&lt;uword&gt; 转换为 Cube&lt;double&gt;,但我想知道为什么会发生这种情况以及是否可以在 RcppArmadillo 中加载 Cube&lt;uword&gt;。因为应该可以吧?

【问题讨论】:

R 没有无符号类型,也没有短字。我们有 integer 用于(有符号)32 位整数,double 用于 64 位。 【参考方案1】:

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

您可以将相同的“技巧”应用于您的犰狳程序,如下所示:

#define ARMA_32BIT_WORD
#include <armadillo>

其中一个效果是 ucube (Cube&lt;uword&gt;) 将使用 32 位无符号整数。

完成上述技巧后,重新编译您的 Armadillo 程序并再次保存 ucubes。然后可以将它们加载到 RcppArmadillo 中。

【讨论】:

以上是关于使用 RcppArmadillo 时无法加载犰狳立方体<uword>的主要内容,如果未能解决你的问题,请参考以下文章

犰狳+NVBLAS 变成 RcppArmadillo+NVBLAS

在rcpp犰狳中将向量与double进行比较

Rcpp犰狳中的样本

使用带有 RcppArmadillo 的 SuperLU 稀疏求解器

犰狳的 print() 方法和 cout 从 Rcpp 调用时的顺序不一致

如何在犰狳中按元素划分2个稀疏矩阵?