【发布时间】:2020-01-25 16:31:42
【问题描述】:
我想在 Rcpp 中将矩阵 M 舍入为任意精度。在 R 中这样做特别容易:
M <- matrix(rnorm(4), 2, 2)
M
[,1] [,2]
[1,] 0.04463484 0.1455878
[2,] 1.77416096 1.0787835
round(M,2)
[,1] [,2]
[1,] 0.04 0.15
[2,] 1.77 1.08
这在 Rcpp / C++ 中被证明是有点挑战的。
有一个round() 函数,但是不幸的是它只能四舍五入到最接近的整数。出于输出目的,例如"%.2f" 格式可用于四舍五入到小数点后两位。如果要在进一步计算中使用四舍五入的数字,可以通过使用手动调整的不同比例因子的floorf、roundf 和ceilingf 函数将单个元素四舍五入到任意精度,请参阅讨论并提出解决方案here。
因此,一种可能的前进方式是将上述方法应用于矩阵M 的每个元素(或更有效地应用于每一列)。这似乎不必要地复杂,我想知道你们中的某个人是否有更有效/优雅的解决方案,可以在 Rcpp 中将矩阵四舍五入到任意精度。
【问题讨论】:
-
您写道“一种可能的前进方式是将上述方法应用于每个元素”,这是一个普遍的事实。没有其他方法。大致来说,each and every Rcpp Sugar 函数最终会下降到对每个元素起作用。它还能如何工作?现在,四舍五入很棘手。刚刚在 r-devel 邮件列表上进行了讨论,R Core 成员 Martin Maechler 刚刚为不同/新方法拆分了一个测试包。因此,您也应该做我们许多人所做的事情:如果您想要/需要不同的行为,请实施它。 Rcpp 是一个工具包。
-
我知道这可能是浮点数学的一个坏主意,但你不能只定义
double round_to_n_places(double& d, int n) { return std::round(d * std::pow(10, n))/std::pow(10, n);}
标签: r rcpp rcpparmadillo