Armadillo ライブラリを使用して C++ でデータを先取りしていました。プログラムの最終製品は、符号なし整数で満たされた立方体である ucube です。実行後、ucube を R にロードして、最終的な統計テストを実行したいと考えています。そのために、配列を返す ucube をロードする C++ 関数を作成しました。
しかし、うまくいきません!「警告: 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で同じ手順を実行してもうまくいかない理由はわかりません。説明のために、toy プログラムを ./a.out A.bin B.bin として実行してください。Cube<double>
後で説明するA.bin と B.binが生成されCube<uword>
ます。
問題
Rcpp::sourceCpp を使用して次の C++ コードをソースし、A.bin を読み込もうとすると動作しますが、 Cube<double>
B.bin を読み込もうとすると動作しません (警告が表示されます)。read_cube("A.bin")
Cube<uword>
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にキャストすることもできますが、なぜこれが発生するのか、RcppArmadillo でCube<double>
a をロードできるかどうかを知りたいです。Cube<uword>
できるはずだからですよね?