2015-12-02 21 views
7

Jestem nowy z Rcpp. Przeczytałem Advanced R by Hadley Wickham i wszystkie winiety Rcpp, ale nie mogę dowiedzieć się, jak manipulować obiektami NumericMatrix.Manipulowanie NumericMatrix w Rcpp

Czy jest jakiś prosty sposób, aby robić takie rzeczy jak ten kod 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 

inny niż zapętlenie na wierszach i kolumnach i ustalania wartości poszczególnych mat[i,j]?


Edycja3: Ok, spróbujmy jeszcze raz.

Oto mój plik 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; 
} 

jakie wskazał mój problem w komentarzach. W pierwszym (// ** 1) muszę napisać dwie pętle, aby ustawić pierwszy wiersz i pierwszą kolumnę. O co pytam: czy jest jakiś prostszy sposób na zrobienie tego, jak możemy to zrobić w R?

To jest ten sam problem, który wskazałem w komentarzach do mojego kodu.

+1

Czy naprawdę przeczytałeś * wszystkie * winiety Rcpp? Ponieważ jestem prawie pewien, że [Quick Reference Guide] (http://dirk.eddelbuettel.com/code/rcpp/Rcpp-quickref.pdf) obejmuje prawie wszystko, o czym jest mowa w pytaniu. – nrussell

+0

Tak, próbuję rzeczy takie jak 'mat (0, _) = NA_REAL;' lub z 'NumericVector :: get_na();'. Próbowałem również '= NumericMatrix :: Row (mat.ncol(), NA_REAL)'. Zawsze dostaję błędy. Jeśli wiesz, jak to zrobić, chętnie się nauczę. Muszę sprecyzować, że nie jest to na etapie inicjacji, że chcę to zrobić, to kilka linii po tym w moim kodzie. – throwic

+0

Ponieważ używasz Rcpp już pętli imho nie jest już złe, a twój główny zysk byłby pod względem przejrzystości kodu. – mts

Odpowiedz

1

Technicznie tak, ale to tylko cukier IIRC. Oto krótka wersja demonstracyjna:

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

Dziękuję bardzo, dokładnie tego potrzebowałem. Po prostu, czy tęskniłem za tą odpowiedzią w Przewodniku szybkiego refleksu lub winietach Rcpp? Gdzie powinienem szukać tego? – throwic

+1

@throwic Nie ma za co! Nie jestem pewien co do dokumentu, ale pojąłem pomysł z tej odpowiedzi Dirka: http://stackoverflow.com/questions/5931092/rcpp-matrix-loop-over-rows-one-column-at-a-time – tonytonov