在Rcpp中操作NumericMatrix

时间:2015-12-02 14:08:13

标签: r rcpp

我是Rcpp的新手。我已阅读Advanced R by Hadley Wickham和所有Rcpp晕影,但我无法理解如何操纵NumericMatrix个对象。

是否有任何简单的方法可以执行R代码

等操作
mat <- matrix(1:9,3,3)
v <- matrix(2,2,2)
mat[1,] <- NA
mat[,3] <- 0.5
mat[2:3,2:3] <- v

除了在行和列上循环并设置每个mat[i,j]的值?

编辑3:好的,让我们再试一次。

这是我的cpp文件:

#include <Rcpp.h>
using namespace Rcpp;    

// [[Rcpp::export]]
NumericMatrix lissage_incapC(NumericMatrix mat) {
// INIT
  NumericMatrix x(mat.nrow()+1,mat.ncol()+1);
  NumericMatrix out(mat.nrow(),mat.ncol());

  // Here i want to set x first row and first column to NA_REAL //**1
  for(int i=0; i<x.nrow(); i++){
    for(int j=0; j<x.ncol(); j++){
      if(i==0 || j==0)
        x(i,j) = NA_REAL; 
      x(i,j) = mat(i-1,j-1);
    }
  }


  for(int i=8; i<x.nrow()-1; i++){
    for(int j=1; j<x.ncol()-1; j++){
      NumericMatrix y = x(Range(i-1,i+1),Range(j-1,j+1)); 
      y(1,1) = NA_REAL; 

      if((i == 8) & (j>1))
        y.row(0) = NumericVector::get_na(); //problem here

      out(i,j-1) = 1/2*x(i,j) + 1/2 * mean(na_omit(y));

      }
    }
  out(_,out.ncol()) = 0.5; // Problem here
  out(Range(0,7),_) = out(8,_); // Problem here
  return out;
}

我在评论中指出了我的问题。在第一个(// ** 1)中,我必须编写两个循环来设置第一行和第一列。 我要问的是:有没有更简单的方法可以做到,就像我们在R中做的那样?

这是我在代码评论中指出的同样问题。

1 个答案:

答案 0 :(得分:2)

技术上是的,虽然它只是糖IIRC。 这是一个简短的演示:

library(inline)
src <- '
       Rcpp::NumericMatrix Am(A);
       NumericVector na_vec(Am.ncol(), NA_REAL);      
       Am(0, _) = na_vec;
       Am(_, 0) = na_vec;
       return Am;
'
f <- cxxfunction(signature(A = "numeric"), body = src, plugin = "Rcpp")
f(matrix(1, 3, 3))
#     [,1] [,2] [,3]
#[1,]   NA   NA   NA
#[2,]   NA    1    1
#[3,]   NA    1    1