2009-04-28 22 views
6

क्या बूस्ट मैट्रिक्स या वेक्टर के सभी तत्वों को स्केलर असाइन करने का एक एकल अभिव्यक्ति तरीका है? मैं का प्रतिनिधित्व करने का एक और अधिक कॉम्पैक्ट रास्ता खोजने की कोशिश कर रहा हूँ:एक बूस्ट वेक्टर या मैट्रिक्स भरना

boost::numeric::ublas::c_vector<float, N> v; 
for (size_t i=0; i<N; i++) { 
    v[i] = myScalar; 
} 

निम्नलिखित काम नहीं करते:

boost::numeric::ublas::c_vector<float, N> 
    v(myScalar, myScalar, ...and so on..., myScalar); 

boost::numeric::ublas::c_vector<float, N> v; 
v = myScalar; 
+0

आप भी इस "सी ++" टैग करना होगा। – TonJ

+0

अच्छा बिंदु। किया हुआ। –

उत्तर

7

क्योंकि वेक्टर मॉडल एक मानक रैंडम एक्सेस कंटेनर आप मानक एसटीएल एल्गोरिदम का उपयोग करने के लिए सक्षम होना चाहिए। की तरह कुछ:

c_vector<float,N> vec; 
std::fill_n(vec.begin(),N,0.0f); 

या

std::fill(vec.begin(),vec.end(),0.0f); 

यह शायद भी Boost.Assign के साथ संगत है, लेकिन आप जाँच करना होगा।

+0

एसटीएल एल्गोरिदम काम करने लगते हैं। धन्यवाद। Boost.Assign मेरे लिए काम नहीं कर रहा है, लेकिन मुझे लगता है कि ऐसा इसलिए है क्योंकि मैं एक वेक्टर (गतिशील रूप से आकार वाले वेक्टर) के बजाय एक c_vector (कॉन्स-साइज्ड वेक्टर) का उपयोग कर रहा हूं, इसलिए push_back काम नहीं करता है। –

+0

यह उत्तर नहीं देता कि आप 'boost :: numeric :: ublas :: matrix' – arman

0

थोड़ी देर के बाद से मैं सी इस्तेमाल किया ++ गया। क्या निम्नलिखित काम करता है?

for (size_t i = 0; i < N; v[i++] = myScalar) ; 
+0

यह काम करेगा, हालांकि यह एक अभिव्यक्ति के विपरीत एक पूर्ण बयान है। –

+0

सच है, लेकिन यह अधिक कॉम्पैक्ट तरीका है जो आप पोस्ट के आधार पर खोजना चाहते थे। –

+0

हां, इसलिए +1। –

6

मैंने उन मामलों के लिए boost::assign का उपयोग करना शुरू कर दिया है जिन्हें मैं स्थिर रूप से विशिष्ट मान (ऊपर दिए गए लिंक से उठाए गए उदाहरण) असाइन करना चाहता हूं।

#include <boost/assign/std/vector.hpp> 
using namespace boost::assign; // bring 'operator+()' into scope 

{ 
    vector<int> values; 
    values += 1,2,3,4,5,6,7,8,9; 
} 

आप मानचित्र के लिए boost::assign का भी उपयोग कर सकते हैं।

#include <boost/assign/list_inserter.hpp> 
#include <string> 
using boost::assign; 

std::map<std::string, int> months; 
insert(months) 
     ("january", 31)("february", 28) 
     ("march",  31)("april", 30) 
     ("may",  31)("june",  30) 
     ("july",  31)("august", 31) 
     ("september", 30)("october", 31) 
     ("november", 30)("december", 31); 

आप के साथ list_of() और map_list_of()

#include <boost/assign/list_of.hpp> // for 'list_of()' 
#include <list> 
#include <stack> 
#include <string> 
#include <map> 
using namespace std; 
using namespace boost::assign; // bring 'list_of()' into scope 

{ 
    const list<int> primes = list_of(2)(3)(5)(7)(11); 
    const stack<string> names = list_of("Mr. Foo")("Mr. Bar") 
             ("Mrs. FooBar").to_adapter(); 

    map<int,int> next = map_list_of(1,2)(2,3)(3,4)(4,5)(5,6); 

    // or we can use 'list_of()' by specifying what type 
    // the list consists of 
    next = list_of< pair<int,int> >(6,7)(7,8)(8,9); 

} 

वहाँ repeat(), repeat_fun() के लिए भी कार्य कर रहे हैं प्रत्यक्ष काम की अनुमति देने के कर सकते हैं और range() जो आप दोहरा मूल्यों या मूल्यों की सीमाएं जोड़ने के लिए अनुमति देता है।

+1

कैसे भरेंगे पहला उदाहरण std :: vector (जिसके लिए यह काम करता है) के लिए प्रतीत होता है, बढ़ावा नहीं :: numeric :: ublas :: वेक्टर (जिसके लिए यह काम नहीं करता है)। –

1

क्या आपने यह कोशिश की है?

ublas :: c_vector v = ublas :: scalar_vector (N, myScalar);

5

तरह से सिफारिश की इस तरह दिखता है:

boost::numeric::ublas::c_vector<float, N> v; 
v = boost::numeric::ublas::zero_vector<float>(N); 
v = boost::numeric::ublas::scalar_vector<float>(N, value); 

ही मैट्रिक्स प्रकार के लिए है:

boost::numeric::ublas::matrix<float> m(4,4); 
m = boost::numeric::ublas::identity_matrix<float>(4,4); 
m = boost::numeric::ublas::scalar_matrix<float>(4,4); 
m = boost::numeric::ublas::zero_matrix<float>(4,4); 
+0

अगर मैं इसे नहीं जानता तो मैं मूल्य प्रकार कैसे प्राप्त करूं? –