RcppArmadillo:arma::cube 的矢量
RcppArmadillo: vector of arma::cube's
我正在使用 RcppArmadillo 在 R/Rcpp 中开发应用程序,我需要使用 arma::cube 个对象的向量。以下示例工作正常。
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
using namespace std;
using namespace Rcpp;
using namespace arma;
// [[Rcpp::export]]
bool posterior(int n, int L, NumericVector N, int TIME) {
vector<cube> A(TIME);
for (int t = 0; t < TIME; t++) A[t] = cube(n, L, max(N), fill::zeros);
Rprintf("*** %.2f ***\n", A[3].at(5, 1, 2));
return true;
}
这里有一些 R 代码来测试它。
library(Rcpp)
sourceCpp("VectorOfCubes.cpp")
posterior(200, 3, c(10, 5, 2), 10^4)
我的问题是:能否去掉上面C++函数中的for
,直接初始化向量A?
为什么不使用默认的 vector
构造函数?
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
bool posterior_default(int n, int L, Rcpp::NumericVector N, int TIME) {
std::vector<arma::cube> A(TIME, arma::cube(n, L, max(N), arma::fill::zeros));
return true;
}
可以使用std::fill
算法,c.f。
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
bool posterior(int n, int L, Rcpp::NumericVector N, int TIME) {
std::vector<arma::cube> A(TIME);
std::fill(A.begin(), A.end(), arma::cube(n, L, max(N), arma::fill::zeros));
return true;
}
不过,更简单的变体是使用 arma::field
to store the values instead of std::vector
and then use the .fill()
成员函数。
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
arma::field<arma::cube> posterior_field(int n, int L, Rcpp::NumericVector N, int TIME) {
arma::field<arma::cube> A(TIME);
A.fill(arma::cube(n, L, max(N), arma::fill::zeros));
return A;
}
输出:
posterior_field(3, 4, c(1,2,3), 10)
# [,1]
# [1,] Numeric,36
# [2,] Numeric,36
# [3,] Numeric,36
# [4,] Numeric,36
# [5,] Numeric,36
# [6,] Numeric,36
# [7,] Numeric,36
# [8,] Numeric,36
# [9,] Numeric,36
# [10,] Numeric,36
我正在使用 RcppArmadillo 在 R/Rcpp 中开发应用程序,我需要使用 arma::cube 个对象的向量。以下示例工作正常。
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
using namespace std;
using namespace Rcpp;
using namespace arma;
// [[Rcpp::export]]
bool posterior(int n, int L, NumericVector N, int TIME) {
vector<cube> A(TIME);
for (int t = 0; t < TIME; t++) A[t] = cube(n, L, max(N), fill::zeros);
Rprintf("*** %.2f ***\n", A[3].at(5, 1, 2));
return true;
}
这里有一些 R 代码来测试它。
library(Rcpp)
sourceCpp("VectorOfCubes.cpp")
posterior(200, 3, c(10, 5, 2), 10^4)
我的问题是:能否去掉上面C++函数中的for
,直接初始化向量A?
为什么不使用默认的 vector
构造函数?
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
bool posterior_default(int n, int L, Rcpp::NumericVector N, int TIME) {
std::vector<arma::cube> A(TIME, arma::cube(n, L, max(N), arma::fill::zeros));
return true;
}
可以使用std::fill
算法,c.f。
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
bool posterior(int n, int L, Rcpp::NumericVector N, int TIME) {
std::vector<arma::cube> A(TIME);
std::fill(A.begin(), A.end(), arma::cube(n, L, max(N), arma::fill::zeros));
return true;
}
不过,更简单的变体是使用 arma::field
to store the values instead of std::vector
and then use the .fill()
成员函数。
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
arma::field<arma::cube> posterior_field(int n, int L, Rcpp::NumericVector N, int TIME) {
arma::field<arma::cube> A(TIME);
A.fill(arma::cube(n, L, max(N), arma::fill::zeros));
return A;
}
输出:
posterior_field(3, 4, c(1,2,3), 10)
# [,1]
# [1,] Numeric,36
# [2,] Numeric,36
# [3,] Numeric,36
# [4,] Numeric,36
# [5,] Numeric,36
# [6,] Numeric,36
# [7,] Numeric,36
# [8,] Numeric,36
# [9,] Numeric,36
# [10,] Numeric,36