如何使用 Rcpp 就地扩展数字矩阵?
How to scale a NumericMatrix in-place with Rcpp?
这就是我现在正在做的事情
library(Rcpp)
A <- diag(c(1.0, 2.0, 3.0))
rownames(A) <- c('X', 'Y', 'Z')
colnames(A) <- c('A', 'B', 'C')
cppFunction('
void scaleMatrix(NumericMatrix& A, double x) {
A = A * x;
}')
不幸的是,它不起作用:(
> A
A B C
X 1 0 0
Y 0 2 0
Z 0 0 3
> scaleMatrix(A, 2)
> A
A B C
X 1 0 0
Y 0 2 0
Z 0 0 3
我从 Rcpp FAQ 的问题 5.1 中了解到,Rcpp 应该能够更改我按值传递的对象。从德克对我上一个问题的回答中窃取一个例子:
> library(Rcpp)
> cppFunction("void inplaceMod(NumericVector x) { x = x * 2; }")
> x <- as.numeric(1:5)
> inplaceMod(x)
> x
[1] 2 4 6 8 10
我很困惑:可以就地修改NumericVector
,但不能修改NumericMatrix
?
您可以使用NumericVector
而不是NumericMatrix
来保留行和列名称,请记住,R 中的矩阵只是一个具有附加维度的向量。您可以在从 R 转到 C++(下面scaleVector
(或C++(下面从现已删除的答案中提取scaleMatrix
@Roland(内执行此切换:
library(Rcpp)
cppFunction('
NumericVector scaleVector(NumericVector& A, double x) {
A = A * x;
return A;
}')
cppFunction('
NumericMatrix scaleMatrix(NumericMatrix& A, double x) {
NumericVector B = A;
B = B * x;
return A;
}')
如果将这两个函数应用于矩阵,则会保留行名和列名。但是,矩阵不会就地更改:
A <- diag(1:3)
rownames(A) <- c('X', 'Y', 'Z')
colnames(A) <- c('A', 'B', 'C')
scaleMatrix(A, 2)
#> A B C
#> X 2 0 0
#> Y 0 4 0
#> Z 0 0 6
scaleVector(A, 2)
#> A B C
#> X 2 0 0
#> Y 0 4 0
#> Z 0 0 6
A
#> A B C
#> X 1 0 0
#> Y 0 2 0
#> Z 0 0 3
原因是diag(1:3)
实际上是一个整数矩阵,因此当您将其传输到数字矩阵(或向量(时会创建一个副本:
is.integer(A)
#> [1] TRUE
如果一开始使用数字矩阵,则进行修改:
A <- diag(c(1.0, 2.0, 3.0))
rownames(A) <- c('X', 'Y', 'Z')
colnames(A) <- c('A', 'B', 'C')
scaleMatrix(A, 2)
#> A B C
#> X 2 0 0
#> Y 0 4 0
#> Z 0 0 6
scaleVector(A, 2)
#> A B C
#> X 4 0 0
#> Y 0 8 0
#> Z 0 0 12
A
#> A B C
#> X 4 0 0
#> Y 0 8 0
#> Z 0 0 12
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 检查输入是否不是整数或数字
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 是否可以通过C++扩展强制多个python进程共享同一内存
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 如何用数字处理log(0)
- 最高有效数字侧的第N位
- 如何获取一个数字的前3位
- 查找最接近的大于当前数字的数字的索引
- 找到两对数字,使它们的乘积的绝对差最小化
- 我想做一个彼此不同但重复出现的数字
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 扩展光电二极管探测器以支持多个传感器
- 将数字转换为字母(例如:123 转换为一二三)
- C++如何计算用户输入的数字中的偶数位数
- 如何使用 Rcpp 就地扩展数字矩阵?
- DiceSum - 如果骰子总和不是某个数字,如何扩展 if/if-else 语句以重新掷骰子
- 如何扩展我的类以接受 c++ 中的 64 位数字
- 在哪里下载BOOST通用图像库的数字扩展