我有一个使用Rcpp编写的小型C++函数,用于将一个矩阵中的元素替换为另一个矩阵中的值。对于单个单元格或者一列来说,它都能正常工作,如下所示:
cppFunction('NumericMatrix changeC(NumericMatrix one, NumericMatrix two) {
NumericMatrix a = one;
NumericMatrix b = two;
b(_,1) = a(_,1);
return b;
}')
changeC(g,f)
如果原来的矩阵f如下:
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 6 6 6 6 6 6
[2,] 6 6 6 6 6 6
[3,] 6 6 6 6 6 6
[4,] 6 6 6 6 6 6
[5,] 6 6 6 6 6 6
[6,] 6 6 6 6 6 6
并且 g 矩阵如下所示:
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 5 5 5 5 5 5
[2,] 5 5 5 5 5 5
[3,] 5 5 5 5 5 5
[4,] 5 5 5 5 5 5
[5,] 5 5 5 5 5 5
[6,] 5 5 5 5 5 5
当我运行 changeC(g,f) 函数时,我得到了预期的结果:
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 6 5 6 6 6 6
[2,] 6 5 6 6 6 6
[3,] 6 5 6 6 6 6
[4,] 6 5 6 6 6 6
[5,] 6 5 6 6 6 6
[6,] 6 5 6 6 6 6
但是我真正想做的是用另一个矩阵的子集替换另一个矩阵的子集(例如,将一个矩阵(3*3)的第1到3行、第1到3列替换为另一个矩阵的第3到6行、第3到6列(也是3*3)。我已经尝试过:
cppFunction('NumericMatrix changeC(NumericMatrix one, NumericMatrix two) {
NumericMatrix a = one;
NumericMatrix b = two;
b( Range(0,2), Range(0,2)) = a( Range(3,5), Range(3,5));
return b;
}')
但是这段代码无法编译。尽管如此:
cppFunction('NumericMatrix changeC(NumericMatrix one, NumericMatrix two) {
NumericMatrix a = one;
NumericMatrix b = two;
b = a( Range(3,5), Range(3,5));
return b;
}')
我的代码是这样的:f[1:3, 1:3] = g[4:6, 4:6],但是它运行得比较慢,尤其是对于非常大的矩阵(因此我使用了Rcpp)。请问我做错了什么?在R中,我会这样做。
谢谢您的帮助。
编辑1
经过一番尝试,我已经成功让我的矩阵向东和向西移动了(我认为向北和向南也可能类似,可能需要一个两步的方法来实现东北、西北等方向的移动?)。
func <- 'NumericMatrix eastC(NumericMatrix a) {
int acoln=a.ncol();
NumericMatrix out(a.nrow(),a.ncol()) ;
for (int j = 0;j < acoln;j++) {
if (j > 0) {
out(_,j) = a(_,j-1);
} else {
out(_,j) = a(_,0);
}
}
return out ;
}'
cppFunction(func)
欢迎进行任何改进。我希望将第一列保留为零而不是0列。有什么想法吗?