2016-08-03 9 views
6

में अभिव्यक्ति टेम्पलेट्स मैं समझना चाहता हूं कि अभिव्यक्ति टेम्पलेट्स Eigen में कैसे काम करते हैं। मैं समझ गया कि दो गतिशील डबल वैक्टर की राशि जो कुछ इस तरह दिखता है द्वारा किया जाता है:ईजिन

CwiseBinaryOp< internal::scalar_sum_op<double>, VectorXd const, VectorXd const > operator+(VectorXd const & lhs, VectorXd const & rhs); 

मैं भी समझ गया कि कैसे दो वैक्टर के अंतर कार्यान्वित किया जाता है।

मेरे दो प्रश्न हैं।

1. स्केलर द्वारा वेक्टर का उत्पाद कैसे काम करता है?

मैं देखा है कि

CwiseBinaryOp< internal::scalar_product_op<double>, VectorXd const, VectorXd const > 

मौजूद है, लेकिन मैं महसूस कर रही है कि यह केवल दो वैक्टर के बीच componentwise कार्रवाई करने के लिए बनाया गया है। यह मतलब यह है कि एक अदिश द्वारा एक वेक्टर के उत्पाद एक एकल ऑपरेटर के अनुरूप है, कहते हैं कि

CwiseUnaryOp< internal::scalar_product_op<double>, VectorXd const, VectorXd const > ? 

2. टेम्पलेट भाव मिश्रित संचालन से बनाया जा सकता है?

उदाहरण के लिए, की तरह

x = u + (2*v + (v-w)) 

एक अभिव्यक्ति में यह सच है कि इन आपरेशनों इस तरह एक नेस्टेड तरह से प्रदर्शन कर रहे हैं क्या है?

  • v-w E2
  • 2*v + (v-w) का एक उदाहरण के निर्माण के लिए
  • 2*v सुराग ई 1 का एक उदाहरण के निर्माण की ओर जाता है निर्माण की ओर जाता है E3
  • u + (2*v + (u-w)) का एक उदाहरण के निर्माण की ओर जाता है ई 4
  • x = u + (2*v + (v-w)) कॉल

निर्माता

VectorXd(E4 const &); 

या अधिक भार

VectorXd & operator=(E4 const &); 

जो पेड़ पिछले चरणों से बनाया मूल्यांकन करता है, निम्नलिखित उपनाम के साथ:

using diff = internal::scalar_difference_op<double>; 
using prod = internal::scalar_product_op<double>; 
using sum = internal::scalar_sum_op<double>; 

using E1 = CwiseBinaryOp< diff, VectorXd const, VectorXd const >; 
using E2 = CwiseUnaryOp< prod, VectorXd const >; 
using E3 = CwiseBinaryOp< sum, E1 const, E2 const >; 

उत्तर

6

1. कैसे उत्पाद करता है एक स्केलर काम से एक वेक्टर के?

Eigen 3.2 में, यह एक functor अदिश कारक के मूल्य के भंडारण के साथ एक एकल-ऑपरेटर के रूप में कार्यान्वित किया जाता है,।

CwiseBinaryOp<scalar_product_op<double,double>, 
       VectorXd, 
       CwiseNullaryOp<scalar_constant_op<double>, VectorXd> > 

यह दृष्टिकोण परमिट स्पष्ट रूप से s*vec और vec*s के बीच अंतर करना, और की वापसी प्रकार, उदाहरण के लिए: Eigen 3.3 में, अब दी मैट्रिक्स अभिव्यक्ति और एक निरंतर अभिव्यक्ति के बीच एक द्विआधारी ऑपरेटर, की तरह कुछ के रूप में कार्यान्वित किया जाता है, vec*svec*VectorxD::Constant(vec.size(),s) में से एक के बराबर है।

2. क्या टेम्पलेट अभिव्यक्ति मिश्रित परिचालन से बनाई जा सकती है?

आपकी समझ सही है:

for(i=0;i<x.size();++i) 
    x[i] = E4.coeff(i); 
+0

आप अपने जवाब के लिए बहुत बहुत धन्यवाद: पहले भाव E1 इ 4 करने के लिए बनाई गई हैं, तो मूल्यांकन की तरह एक कोड जनरेट अतिभारित operator= से शुरू होता है! – Aleph

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