2015-01-14 8 views
5

मैं RcppEigen में कुछ कोड लिख रहा हूँ, और मैं documentation में इस अशुभ चेतावनी भर में आया था:क्या RcppEigen में मैप किए गए मैट्रिक्स को संशोधित करना ठीक है?

एक चाहिए, ज़ाहिर है, सी ++ कोड में आर ऑब्जेक्ट की सामग्री नहीं संशोधित करने के लिए सावधान रहना होगा। एक अनुशंसित अभ्यास मैप किए गए ऑब्जेक्ट्स को कॉन्स के रूप में घोषित करना हमेशा होता है।

यह "मैप किए गए" मैट्रिक्स को संदर्भित करता है, यानी ईजिन में मैट्रिस जो समान आर ऑब्जेक्ट के समान स्मृति का उपयोग करते हैं।

क्या यह चेतावनी सिर्फ अच्छे कार्यात्मक प्रोग्रामिंग अभ्यास के बारे में है, या क्या ऐसी अन्य चीजें हैं जो गलत हो सकती हैं अगर मैप किए गए ऑब्जेक्ट्स को संशोधित करने के लिए उपयोग करता हूं?


इस का एक सरलीकृत संस्करण है जो मैं Rcpp में कर रहा हूँ:

#include <RcppEigen.h> 
// [[Rcpp::depends(RcppEigen)]] 

// [[Rcpp::export]] 
void modify(Eigen::Map<Eigen::MatrixXd> X) { 

    X(0,0) = 0; 
    return; 
} 

कौन सा आर में इस तरह काम करता है:

X <- matrix(1:4, 2) + 0 
X 
#  [,1] [,2] 
# [1,] 1 3 
# [2,] 2 4 
modify(X) 
X 
#  [,1] [,2] 
# [1,] 0 3 
# [2,] 2 4 

विशेष समस्या मैं कर रहा हूँ के लिए काम करने पर मुझे अपने मैट्रिक्स को जगह में संशोधित करके 5x की गति में वृद्धि हो रही है, इसलिए मैं पठनीयता और रखरखाव के मामले में उस छोटे बलिदान के लिए तैयार हूं। जहां तक ​​मैं कह सकता हूं कि यह इरादे से काम कर रहा है, लेकिन मुझे चिंता है कि मैं भविष्य में कुछ समय के सूक्ष्म बग को आमंत्रित कर रहा हूं।

उत्तर

9

को संशोधित करना बिल्कुल ठीक है बशर्ते आप R में चर के दुष्प्रभाव के बारे में अवगत रहें।

पूरी तरह से कार्यात्मक दुनिया में, आप कोई दुष्प्रभाव नहीं चाहते हैं: इनपुट संसाधित हो जाते हैं और परिवर्तित नहीं होते हैं, परिणाम लौटाया जाता है।

यहां हमारे पास एक अधिक संकर दृष्टिकोण है। वस्तुओं को SEXP के रूप में आर से पारित किया जाता है, और पी सूचक के लिए खड़ा होता है --- इसलिए परिवर्तन जारी रहता है। इससे कुछ लोगों को भ्रमित किया जाता है, और हमें कभी-कभी यहां बताना होगा कि इससे कैसे बचें। :)

लेकिन कम आप, सुरक्षित हैं विशेष रूप से अगर सिर्फ तत्वों की स्थापना की और फेरबदल आयाम आदि पीपी की तरह पागल सामान नहीं करते में।

+0

इतनी तेजी से था कि इतने मुझे एक और 10 के लिए इस सवाल का जवाब स्वीकार नहीं दूँगी मिनट। धन्यवाद! – pete

+5

भाग्यशाली समय। मैं बस कुछ अन्य आरसीपीपी से संबंधित कोड लिखने के लिए बैठ गया, ताज़ा किया, अपना प्रश्न देखा और सहायक होने की कोशिश की ;-) –

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