如何用来自另一个矩阵的值替换C++中的矩阵元素(使用RCPP)? [英] How to replace elements of a matrix in C++ with values from another matrix (using Rcpp)?

查看:55
本文介绍了如何用来自另一个矩阵的值替换C++中的矩阵元素(使用RCPP)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个使用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
但我真正想做的是将一个矩阵的子集替换为来自不同位置的另一个矩阵的子集(例如,一个矩阵的行1到3,列1到3(3*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;
}')

可以编译。我做错了什么?在R中,我将执行以下操作:

f[1:3,1:3]<;-g[4:6,4:6](但由于矩阵非常大,因此RCPP相对较慢。

提前感谢您的帮助。

编辑%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列。有什么想法吗?

推荐答案

我认为RCPP子矩阵不允许以这种方式进行赋值。

了解如何使用RcppArmadillo和Armadillo submatrix views

#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]

using namespace arma;

// [[Rcpp::export]]
mat example( mat m1, mat m2) {
  m1.submat( 0,0, 2,2) = m2.submat( 3,3, 5,5 );
  return m1;
}

/*** R
m1 <- matrix(1,6,6)
m2 <- matrix(-1,6,6)
example(m1, m2)
*/

> m1 <- matrix(1,6,6)

> m2 <- matrix(-1,6,6)

> example(m1, m2)
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]   -1   -1   -1    1    1    1
[2,]   -1   -1   -1    1    1    1
[3,]   -1   -1   -1    1    1    1
[4,]    1    1    1    1    1    1
[5,]    1    1    1    1    1    1
[6,]    1    1    1    1    1    1

这篇关于如何用来自另一个矩阵的值替换C++中的矩阵元素(使用RCPP)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆