मैं अपने कार्यक्रम में रैखिक बीजगणित इंजन के रूप में ईजिन मैट्रिक्स लाइब्रेरी का उपयोग करना चाहता हूं। आइजीन आलसी मूल्यांकन को लागू करने और लूप और गणना को सरल बनाने के लिए अभिव्यक्ति टेम्पलेट का उपयोग करता है।अभिव्यक्ति टेम्पलेट का उपयोग करने वाली लाइब्रेरी को एकीकृत कैसे करें?
उदाहरण के लिए:
#include<Eigen/Core>
int main()
{
int size = 40;
// VectorXf is a vector of floats, with dynamic size.
Eigen::VectorXf u(size), v(size), w(size), z(size);
u = 2*v + w + 0.2*z;
}
के बाद से Eigen अभिव्यक्ति टेम्पलेट्स, कोड का उपयोग करता है की तरह
u = 2*v + w + 0.2*z;
ऊपर उल्लेख नमूने में लंबाई 10 (नहीं 40 की एक एकल पाश को कम कर देता है, तैरता डाल रहे हैं अस्थायी बनाने के बिना 4 के टुकड़ों द्वारा regiser में)। कितना मजेदार था वो?
लेकिन अगर मैं इस तरह पुस्तकालय एकीकृत:
class UsingEigen
{
public:
UsingEigen(const Eigen::VectorXf& data):
data_(data)
{}
UsingEigen operator + (const UsingEigen& adee)const
{
return UsingEigen(data_ + adee.data_);
}
...
private:
Eigen::VectorXf data_;
}
तो जैसे भाव:
UsingEigen a, b, c, d;
a = b + c + d;
रास्ता Eigen कार्यान्वित किया जाता है का लाभ नहीं ले सकते। और यह आखिरी नहीं है। कई अन्य उदाहरण हैं, जहां ईजिन में अभिव्यक्ति टेम्पलेट का उपयोग किया जाता है।
आसान उपाय, अपने आप से ऑपरेटरों को परिभाषित data_
सार्वजनिक करने और जैसे भाव लिखने के लिए नहीं होगा:
UsingEigen a, b, c, d;
a.data_ = b.data_ + c.data_ + d.data_;
यह कैप्सूलीकरण टूट जाता है, लेकिन यह Eigen की दक्षता बरकरार रखता है।
अन्य तरीकों से मेरे अपने ऑपरेटरों को बनाने के लिए हो सकता है, लेकिन उन्हें अभिव्यक्ति टेम्पलेट्स लौटाने दें। लेकिन चूंकि मैं सी ++ में एक नौसिखिया हूं, मुझे नहीं पता कि यह जाने का सही तरीका है या नहीं।
मुझे खेद है कि प्रश्न प्रकृति में बहुत सामान्य है। मैं एक नौसिखिया हूं और पूछने के लिए कोई नहीं है। अब तक मैं हर जगह std::vector<float>
का उपयोग कर रहा था, लेकिन अब मुझे मैट्रिक्स का उपयोग करने की आवश्यकता है। मेरी पूरी परियोजना में std::vector<float>
से ईजिन तक स्विच करने के लिए एक बड़ा कदम है और मुझे शुरुआत में गलत कॉल करने से डर है। किसी भी सलाह का स्वागत है!
दिलचस्प समस्या। पहली बात यह है कि, आप इस तरह से ईजिन लाइब्रेरी वैक्टरों को क्यों समाहित करना चाहते हैं? आपके वर्ग क्या व्यवहार करते हैं? –
मेरी कक्षाएं ईजिन लाइब्रेरी कक्षाओं में स्वयं को कोई कार्यक्षमता नहीं जोड़ती हैं, लेकिन उनका उपयोग करें। उदाहरण के लिए मेरे कोर वर्गों में से एक दो वैक्टर स्टोर करता है। एक निश्चित गणितीय गणना के लिए एक इनपुट के रूप में और दूसरा आउटपुट के रूप में। जैसा कि मैंने उपर्युक्त उल्लेख किया है, इन वस्तुओं को एक समान तरीके से अंतःक्रिया करने की आवश्यकता है। जब आप दो ऐसी वस्तुएं जोड़ते हैं, तो इनपुट जोड़ना चाहिए। –
मुझे नहीं लगता कि अभिव्यक्ति टेम्पलेट ढांचे के अपने हिस्से को पुन: उत्पन्न किए बिना यह संभव है। उदाहरण के लिए, '(ए + बी) * सी' कुछ' ExprCwiseAdd * UsingEigen' जैसा होगा (नाम बनाया गया है, इसे अब याद नहीं है), और वहां कहीं भी परिभाषित 'ExprCwiseAdd * UseEigen' होना होगा) , लेकिन 'ExprCwiseAdd * ExprCWiseAdd' और इसी तरह भी। संक्षेप में, अतिरिक्त में 'UseEigen' रिटर्न प्रकार के रूप में नहीं होगा। (आप [बूस्ट :: प्रोटो] (http://www.boost.org/doc/libs/1_49_0/doc/html/proto.html) पर एक नज़र डाल सकते हैं जो अभिव्यक्ति टेम्पलेट्स के लिए एक ढांचा है)। सौभाग्य। – eudoxos