2015-12-02 19 views
7

में न्यूमेरिकमैट्रिक्स मैनिपुलेटिंग मैं आरसीपीपी के साथ नया हूं। मैंने Advanced R by Hadley Wickham और सभी आरसीपीपी विगेट्स पढ़े हैं, लेकिन मुझे यह नहीं पता कि 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: ठीक है दोबारा प्रयास करें।

#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; 
} 

मैं टिप्पणी में मेरी समस्या बताया गया है:

यहाँ मेरी cpp फ़ाइल है। पहले में (// ** 1) मुझे पहली पंक्ति और पहला कॉलम सेट करने के लिए दो लूप लिखना होगा। मैं जो पूछ रहा हूं वह है: क्या ऐसा करने का कोई आसान तरीका है, जैसे हम आर में कर सकते हैं?

यह वही समस्या है जो मैंने अपने कोड की टिप्पणियों में इंगित की है।

+1

तुम सच में पढ़ी * सभी Rcpp विगनेट्स की *: यहाँ एक छोटा डेमो है? क्योंकि मुझे पूरा यकीन है कि [त्वरित संदर्भ मार्गदर्शिका] (http://dirk.eddelbuettel.com/code/rcpp/Rcpp-quickref.pdf) आपके प्रश्न में उल्लिखित सब कुछ के बारे में बताता है। – nrussell

+0

हां, मैंने 'mat (0, _) = NA_REAL; 'या' न्यूमेरिक वेक्टर :: get_na(); 'जैसी चीज़ों की कोशिश की। मैंने '= न्यूमेरिकमैट्रिक्स :: पंक्ति (mat.ncol(), NA_REAL) भी कोशिश की। मुझे हमेशा त्रुटियां मिलती हैं। यदि आप जानते हैं कि इसे कैसे करें, तो मुझे सीखने में खुशी होगी। मुझे यह सटीक होना चाहिए कि यह उस अंतर्निहित चरण में नहीं है जिसे मैं करना चाहता हूं, उसके बाद मेरे कोड में कुछ पंक्तियां हैं। – throwic

+0

चूंकि आप आरसीपीपी का उपयोग कर रहे हैं क्योंकि पहले से ही लूपिंग आईएमओ अब खराब नहीं है और आपका मुख्य लाभ कोड स्पष्टता के मामले में होगा। – mts

उत्तर

1

तकनीकी रूप से हाँ, हालांकि यह केवल एक चीनी आईआईआरसी है।

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

आपको बहुत बहुत धन्यवाद, यही वही है जो मुझे चाहिए था। बस यह सुनिश्चित करने के लिए, क्या मुझे आरसीपीपी रेफ रेफ गाइड या विगेट्स में उस जवाब को याद आया? मुझे यह कहां मिलना चाहिए? – throwic

+1

@ थ्रोइक आपका स्वागत है! डॉक्टर के बारे में निश्चित नहीं है, लेकिन मैंने इस डिर्क के उत्तर से विचार उधार लिया: http://stackoverflow.com/questions/5931092/rcpp-matrix-loop-over-rows-one-column-at-a-time – tonytonov

संबंधित मुद्दे