【发布时间】:2019-12-28 22:47:05
【问题描述】:
谁能解释以下行为?
当声明一个新的NumericMatrixy 作为原始矩阵x 乘以一个标量c 时,标量/矩阵乘法的顺序很重要。如果我将左边的标量和右边的矩阵相乘(例如NumericMatrix y = c * x;),那么我会得到奇怪的行为。原来的矩阵x被改变了!
但是,如果我将原始矩阵放在左边并乘以右边的标量(例如NumericMatrix y = x * c;),x 保持不变。
这似乎不会影响其他数据类型。我已经用int 和NumericVector 进行了测试。
示例:使用NumericMatrix时出现问题
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
NumericMatrix testfun(NumericMatrix x) {
NumericMatrix y(x.rows(), x.cols());
y = x * 2;
std::cout << x; // x is unmodified
y = 2 * x;
std::cout << x; // x is now modified
return x;
}
/*** R
x <- matrix(2, nrow = 3, ncol = 3)
print(x)
y <- testfun(x = x)
print(y)
print(x)
*/
输出如下。
> x <- matrix(2, nrow = 3, ncol = 3)
> print(x)
[,1] [,2] [,3]
[1,] 2 2 2
[2,] 2 2 2
[3,] 2 2 2
> y <- testfun(x = x)
2.00000 2.00000 2.00000
2.00000 2.00000 2.00000
2.00000 2.00000 2.00000
4.00000 4.00000 4.00000
4.00000 4.00000 4.00000
4.00000 4.00000 4.00000
> print(y)
[,1] [,2] [,3]
[1,] 4 4 4
[2,] 4 4 4
[3,] 4 4 4
> print(x)
[,1] [,2] [,3]
[1,] 4 4 4
[2,] 4 4 4
[3,] 4 4 4
这是我的会话信息
> sessionInfo()
R version 3.6.1 (2019-07-05)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS Catalina 10.15.1
Matrix products: default
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/3.6/Resources/lib/libRlapack.dylib
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
[1] compiler_3.6.1 tools_3.6.1 RcppArmadillo_0.9.800.1.0
[4] Rcpp_1.0.2 RcppProgress_0.4.1 packrat_0.5.0
[7] RcppParallel_4.4.4
.
【问题讨论】:
-
我看不出“按引用传递与按值传递”如何成为问题。如果是这样,我希望看到
int和NumericVector的行为相同。为什么这只会影响NumericMatrix? -
为了更简洁地说明这一点,当
clone被传递一个表达式时,使用链接的“答案”中建议的Rcpp::clone仍然会修改x作为副作用:@987654341当x是Rcpp::NumericMatrix时,@ 修改x。所以我同意这个答案不从表面上看是令人满意的。 -
@TommyJones 虽然你不对:
int,但我也期待Rcpp::NumericVector;我不认为Rcpp类的现有讨论(至少不是我见过的讨论)以及通过引用与值传递足以解释用NumericVector观察到的行为以及它与观察到的对比NumericMatrix的行为。也许我遗漏了一些东西,但我认为你的问题需要一个新的答案。如果您可以在顶部使用非常简洁的简介来编辑您的问题,解释为什么它与标记的重复项不同(这对您来说应该很容易),这可能会有所帮助 -
很高兴这样做。明天会有事。
-
很抱歉我没有更简洁。在我的辩护中,该问题已在顶部说明,第一个示例说明了这一点。 my 问题也解决了。 (我颠倒了乘法的顺序。)我发表这篇文章是为了帮助可能遇到这个问题的其他人。昨天我花了很多时间在 Rcpp 的 GitHub 页面、邮件列表和堆栈溢出上搜索问题,以确保在此处发布问题之前没有得到回答。我很感激你和我一样免费这样做。我昨天花了几个小时回答用户关于我自己的包的问题。 :(
标签: rcpp