- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 Armadillo 库在 C++ 中预先处理数据。程序最终产品是一个 ucube,它是一个用无符号整数填充的立方体。运行后,我想将 ucube 加载到 R 以执行一些最终的统计测试。为此,我创建了一个 C++ 函数来加载返回数组的 ucube。
但它不起作用!
我收到以下警告:“警告:Cube::load():B.bin 中的 header 不正确” 并且程序返回一个 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;
}
当然我可以投Cube<uword>
到 Cube<double>
在结束 C++ 程序之前,但我想知道为什么会发生这种情况以及是否可以加载 Cube<uword>
在 RcppArmadillo 中。因为这应该是可能的,对吧?
最佳答案
不幸的是,R 仍然只支持 32 位整数,因此 RcppArmadillo 强制 Armadillo 使用 32 位整数。这是通过定义 ARMA_32BIT_WORD
来完成的在包括 Armadillo header 之前。查看 RcppArmadillo 的配置 here .
您可以像这样在 Armadillo 程序中应用相同的“技巧”:
#define ARMA_32BIT_WORD
#include <armadillo>
其中一个影响是 ucube ( Cube<uword>
) 将使用 32 位无符号整数。
完成上述技巧后,重新编译 Armadillo 程序并再次保存 ucubes。然后可以将它们加载到 RcppArmadillo 中。
关于c++ - 使用 RcppArmadillo 时无法加载 Armadillo Cube<uword>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57802546/
我对这些操作的结果有几个疑问。 首先,如果我有两个整数,将它们相除并将结果保存为 double 。是否存在任何舍入问题,例如 1/2 等于 0.5 而不是 1。 double ratio = int1
处理器中有很多 16 位寄存器,其定义如下 #define CAN_REG01 (*((uword volatile far *) 0x200000)) 如果寄存器及其值仍然
我使用 Armadillo 库在 C++ 中预先处理数据。程序最终产品是一个 ucube,它是一个用无符号整数填充的立方体。运行后,我想将 ucube 加载到 R 以执行一些最终的统计测试。为此,我创
我有以下功能: uword ADC_uwReadConv(void) { ADCIR = 0; return(ADDAT); } 该函数返回(C164CI)AD 转换的结果。低10位包含转换结
我是一名优秀的程序员,十分优秀!