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.
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
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
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