2015-12-02 19 views
7

Sono nuovo con Rcpp. Ho letto Advanced R by Hadley Wickham e tutte le vignette Rcpp ma non riesco a capire come manipolare gli oggetti NumericMatrix.Manipolazione di NumericMatrix in Rcpp

Esiste un modo semplice per fare le cose come questo codice 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 

diverso da loop su righe e colonne e l'impostazione del valore di ogni mat[i,j]?


Edit3: Ok proviamo di nuovo.

Ecco il mio file 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; 
} 

ho sottolineato il mio problema nei commenti. Nel primo (// ** 1) devo scrivere due loop per impostare la prima riga e la prima colonna. Quello che sto chiedendo è: c'è un modo più semplice per farlo, come possiamo fare in R?

Questo è lo stesso problema che ho indicato nei commenti del mio codice.

+1

Hai letto veramente * tutto * delle vignette Rcpp? Perché sono abbastanza sicuro che la [Guida rapida di riferimento] (http://dirk.eddelbuettel.com/code/rcpp/Rcpp-quickref.pdf) copre quasi tutto ciò che è menzionato nella tua domanda. – nrussell

+0

Sì, ho provato cose come 'mat (0, _) = NA_REAL;' o con 'NumericVector :: get_na();'. Ho anche provato '= NumericMatrix :: Row (mat.ncol(), NA_REAL)'. Ottengo sempre errori Se sai come farlo, sarei felice di imparare. Devo precisare che non è al passo init che voglio farlo, sono poche righe dopo di ciò nel mio codice. – throwic

+0

Dato che stai usando Rcpp già in loop, imho non è più cattivo e il tuo guadagno principale sarebbe in termini di chiarezza del codice. – mts

risposta

1

Tecnicamente sì, anche se è solo zucchero IIRC. Ecco una breve demo:

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 
+0

Grazie mille, è esattamente ciò di cui avevo bisogno. Giusto per essere sicuro, ho perso quella risposta in Rcpp Quick Ref Guide o vignette? Dove avrei dovuto cercare questo? – throwic

+1

@throwic Prego! Non sono sicuro del doc, ma ho preso in prestito l'idea dalla risposta di Dirk: http://stackoverflow.com/questions/5931092/rcpp-matrix-loop-over-rows-one-column-at-a-time – tonytonov