- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 RcppArmadillo 从 R 到 Rcpp 的转换 arma::vec
就像使用 Rcpp 和 NumericVector
一样简单.我的项目使用 RcppArmadillo。
我不确定要使用什么,NumericVector
或 arma::vec
?这两者之间的主要区别是什么?什么时候用哪个?使用一个比另一个有性能/内存优势吗?唯一的区别是成员函数吗?而且,作为一个额外的问题:我是否应该考虑 arma::colvec
或 arma::rowvec
?
最佳答案
What are the key differences between those two?
*Vector
和
*Matrix
Rcpp 中的类充当 R 的 SEXP 表示的包装器,例如作为指向数据的指针的 S 表达式。详情请见
Section 1.1 SEXPs的
R Internals .Rcpp 的设计通过从包含指向数据的指针的类构造 C++ 对象来利用这一点。这促进了两个关键特性:
arma
对象类似于传统的
std::vector<T>
以在 R 和 C++ 对象之间发生深拷贝的方式。此语句有一个异常(exception),即
advanced constructor 的存在。 ,这允许 R 对象后面的内存为
重复使用 内部
armadillo
对象的结构。因此,如果您不小心,您可能会在从 R 到 C++ 的转换过程中招致不必要的惩罚,反之亦然。
arma::sp_mat
不存在允许重用内存的高级构造函数.因此,在从 R 到 C++ 并返回执行复制时,使用具有稀疏矩阵的引用可能不会产生所需的加速。
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
void memory_reference_double_ex(arma::vec& x, double value) {
x.fill(value);
}
// [[Rcpp::export]]
void memory_reference_int_ex(arma::ivec& x, int value) {
x.fill(value);
}
// [[Rcpp::export]]
arma::vec memory_copy_ex(arma::vec x, int value) {
x.fill(value);
return x;
}
memory_reference_double_ex()
和
memory_reference_int_ex()
假设存在适当的数据类型,将更新 R 中的对象。因此,我们可以通过指定
void
来避免返回值。在它们的定义中,因为
x
分配的内存正在被重用。第三个函数,
memory_copy_ex()
需要返回类型,因为它是按副本传递的,因此不会在没有重新分配调用的情况下修改现有存储。
x
vector 将通过引用传递到 C++ 中,例如&
末arma::vec&
或 arma::ivec&
, 和 x
类(class)在 R 中是 double
或 integer
这意味着我们正在匹配 arma::vec
的基础类型,例如 Col<double>
, 或 arma::ivec
,例如Col<int>
. memory_reference_double_ex()
的结果。并将其与
memory_copy_ex()
生成的结果进行比较.请注意,在 R 和 C++ 中定义的对象之间的类型是相同的(例如
double
)。在下一个示例中,这将不成立。
x = c(0.1, 2.3, 4.8, 9.1)
typeof(x)
# [1] "double"
x
# [1] 0.1 2.3 4.8 9.1
# Nothing is returned...
memory_reference_double_ex(x, value = 9)
x
# [1] 9 9 9 9
a = memory_copy_ex(x, value = 3)
x
# [1] 9 9 9 9
a
# [,1]
# [1,] 3
# [2,] 3
# [3,] 3
# [4,] 3
integer
会发生什么?而不是
double
?
x = c(1L, 2L, 3L, 4L)
typeof(x)
# [1] "integer"
x
# [1] 1 2 3 4
# Return nothing...
memory_reference_double_ex(x, value = 9)
x
# [1] 1 2 3 4
x
得到更新?好吧,Rcpp 在幕后创建了一个正确类型的新内存分配——
double
而不是
int
-- 在将其传递给
armadillo
之前.这导致两个对象之间的引用“链接”不同。
armadillo
中使用整数数据类型向量,注意我们现在有之前给出的相同效果:
memory_reference_int_ex(x, value = 3)
x
# [1] 3 3 3 3
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
void copy_double_ex(arma::vec x, double value) {
x.fill(value);
}
// [[Rcpp::export]]
void reference_double_ex(arma::vec& x, double value) {
x.fill(value);
}
# install.packages("microbenchmark")
library("microbenchmark")
x = rep(1, 1e8)
micro_timings = microbenchmark(copy_double_ex(x, value = 9.0),
reference_double_ex(x, value = 9.0))
autoplot(micro_timings)
micro_timings
# Unit: milliseconds
# expr min lq mean median uq max neval
# copy_double_ex(x, value = 9) 523.55708 529.23219 547.22669 536.71177 555.00069 640.5020 100
# reference_double_ex(x, value = 9) 79.78624 80.70757 88.67695 82.44711 85.73199 308.4219 100
When to use which?
Is there a performance/memory advantage of using one over the other?
Are the only difference the member functions?
armadillo
使用系统的基本线性代数子程序 (BLAS) 来执行计算。
And, as a bonus question: should I even consider arma::colvec or arma::rowvec?
1 x N
(行向量)或
N x 1
(列向量)?
RcppArmadillo
默认情况下,将这些结构作为具有适当维度的矩阵对象而不是传统的一维 R 向量返回。
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
arma::vec col_example(int n) {
arma::vec x = arma::randu<arma::vec>(n);
return x;
}
// [[Rcpp::export]]
arma::rowvec row_example(int n) {
arma::rowvec x = arma::randu<arma::rowvec>(n);
return x;
}
set.seed(1)
col_example(4)
# [,1]
# [1,] 0.2655087
# [2,] 0.3721239
# [3,] 0.5728534
# [4,] 0.9082078
set.seed(1)
row_example(4)
# [,1] [,2] [,3] [,4]
# [1,] 0.2655087 0.3721239 0.5728534 0.9082078
关于r - 在 Rcpp 中决定 NumericVector 和 arma::vec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50170166/
code (m); arma::umat a=trans(M)>M; arma::mat N=a; return Rcpp::wrap(N); ' coxFunc ::from(var)你想要
我有一个矩阵 X,它由 arma::vectorise 函数矢量化。在对转换后的向量 x 进行一些计算后,我想将其整形为 arma::mat。我尝试在 Armadillo 中使用 .reshape 函
我有一个矩阵 X,它由 arma::vectorise 函数矢量化。在对转换后的向量 x 进行一些计算后,我想将其整形为 arma::mat。我尝试在 Armadillo 中使用 .reshape 函
我正在尝试测试 ARMA 模型,并完成此处提供的示例: http://www.statsmodels.org/dev/examples/notebooks/generated/tsa_arma_0.h
时间序列的 ARMA 预测摘要 ( print arma_mod.summary() ) 显示了一些关于置信区间的数字。是否可以将这些数字用作显示预测值的图中的预测区间? ax = indexed_d
开始有 R 经验,但完全是 C++ 新手,我用 RcppArmadillo 编写了一些函数,并且对它的可用性和速度非常热情。我现在想使用函数 RcppArmadillo.package.skeleto
我有大约五年的一年期利率数据。我想为此利率创建一个模型,并且得出的结论是 ARMA(3,2) 和 GARCH(1,1) 是合适的。因此,我使用下面的代码来获得我的估计。 > stibor1ydarma
当尝试将带有 statsmodels 的 ARMA(1,2) 拟合到股票数据时间序列的对数返回时,我收到错误“计算的初始 AR 系数不是平稳的”我认为我尝试分析的时间序列本身是平稳的,并且与白噪声非常
我想预测一个时间序列的返回,我首先拟合了数据集,但当我预测明天的返回时它不起作用。我的代码是 date = datetime.datetime(2014,12,31) todayDat
我正在使用 arma::find_unique,我认为它返回了 vector 中每个唯一值第一次出现的索引,但它似乎返回了其他内容。 这是一个玩具函数: // [[Rcpp::export]] arm
我正在做这个作业,我试图运行这个程序 5000 次,并对模型进行 AR(1) 和 AR(2) 拟合。首先,我定义了一个生成时间序列的函数,如下所示: def ts_gen_ar1(size,sigma
这里有点新,但试图让 statsmodel ARMA 预测工具起作用。我从 Yahoo 导入了一些股票数据,并让 ARMA 给我拟合参数。然而,当我使用预测代码时,我收到的只是一个我似乎无法弄清楚的错
我想预测时间序列数据。我在之前的帖子中读到模块 statsmodels 具有使用 ARMA 方法进行预测所需的工具,这正是我一直在寻找的工具。尽管如此,我在预测数据时遇到了麻烦。有人可以解释模型中使用
data <-c(88, 84, 85, 85, 84, 85, 83, 85, 88, 89, 91, 99, 104, 112, 126, 138, 146,151, 150, 148, 14
我正在尝试设置 arma::mat 的值元素方面,每个元素的值取决于每个元素的多索引(行、列)。 有没有办法在迭代期间检索元素的当前位置? 基本上,我想做点什么like in the sparse m
vector y_long_name 有 100 个成员,我打算只操作它的一个由前三个成员组成的子 vector 。 subvector 函数在我的代码中用作左值: y_long_name.subve
如何将 arma::cx_mat 转换为数组数组? 转换的动机是使用 C 库 libmatio 来输出 .mat 文件。 到目前为止,我已经创建了一个函数来将 arma:cx_mat 转换为 vect
我的问题相当简单:我想使用 statsmodels 定义 ARMA 建模过程中的特定顺序滞后。 假设我有一个时间序列 TS,我想估计以下模型作为示例: TS(t)= c + TS(t-2) + TS(
我想要将 ARMA(p,q) 模型拟合到模拟数据 y,并检查不同估计方法对结果的影响。但是,像这样将模型拟合到同一对象 model = tsa.ARMA(y,(1,1)) results_mle =
是否有任何 C++ 库允许计算时间序列的 ARMA?经过多次搜索尝试后,我一直找不到任何内容。 谢谢! 最佳答案 Cronos是一个用 C++ 编写的支持 ARMA 模型的开源库。虽然它没有任何文档,
我是一名优秀的程序员,十分优秀!