मैं 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 की गति में वृद्धि हो रही है, इसलिए मैं पठनीयता और रखरखाव के मामले में उस छोटे बलिदान के लिए तैयार हूं। जहां तक मैं कह सकता हूं कि यह इरादे से काम कर रहा है, लेकिन मुझे चिंता है कि मैं भविष्य में कुछ समय के सूक्ष्म बग को आमंत्रित कर रहा हूं।
इतनी तेजी से था कि इतने मुझे एक और 10 के लिए इस सवाल का जवाब स्वीकार नहीं दूँगी मिनट। धन्यवाद! – pete
भाग्यशाली समय। मैं बस कुछ अन्य आरसीपीपी से संबंधित कोड लिखने के लिए बैठ गया, ताज़ा किया, अपना प्रश्न देखा और सहायक होने की कोशिश की ;-) –