2013-10-14 10 views
13

से मैट्रिक्स प्रारंभिकता मैं आर्मडिलो का उपयोग करने के लिए नया हूं, और कोशिश करने/खोज करने के बावजूद निम्नलिखित नहीं मिल सका।आर्मडिलो सी ++: सरणी

दो विशाल (गतिशील) सरणी (वैक्टर नहीं) हैं जिन्हें मुझे सहसंबंध करने की आवश्यकता है। मैंने इसके लिए armadillo का उपयोग करने का संकल्प किया। मैं समझता हूं कि वेक्टर का उपयोग करके arma :: mat को कैसे प्रारंभ करें, लेकिन क्या मैं ऐसा करने के लिए सरणी का उपयोग कर सकता हूं? मैं समझ नहीं पा रहा हूं क्योंकि मुझे documentation में कोई उल्लेख नहीं दिख रहा है। मैं आंतरिक डिजाइन कारणों के लिए वैक्टरों के उपयोग से बचने की कोशिश कर रहा हूं। मैंने नमूना सरणी (एक गूंगा लेकिन प्रारंभ बिंदु के रूप में) का उपयोग करके प्रत्येक तत्व को मैन्युअल रूप से प्रारंभ करने का प्रयास किया। निम्नलिखित कोड की तरह कुछ काम नहीं करेगा।

using namespace std; 
using namespace arma; 

mat A(SIZE, 1), B(SIZE, 1); 

for(int i = 0; i < SIZE; i++) 
{ 
    A << v[i] << endr; 
    B << c[i] << endr; 
} 

cout << "A: " << endl; 
A.print(); 
cout << "B: " << endl; 
B.print(); 

इनपुट सरणियों वी = के लिए {1, 2, 0, -1, .9} और ग = {0, .5, 1, -2, -5}। आउटपुट होगा:

A: 
     0 
B: 
    -5.0000 

जो समझ में आता है। arma :: mat या arma :: arrve के साथ colvector प्रारंभ करने के लिए चारों ओर कोई काम? अग्रिम में धन्यवाद! the armadillo doc से

:

+2

जैसे << ऑपरेटर का उपयोग न करें जब तक आप एक ही बार में सभी तत्वों को आरंभ करने जा रहे हैं (। एक << 4 << 5 << 9)। या तो तत्वों को सेट करने के लिए लूप का उपयोग करें, या नीचे मार्टिन जे द्वारा वर्णित अधिक कुशल aux_mem कन्स्ट्रक्टर विधि का उपयोग करें। – mtall

+0

हां, मुझे एहसास हुआ कि << ऑपरेटर रास्ता नहीं है। aux_mem काम किया। धन्यवाद! –

उत्तर

7

यह मानते हुए कि आपके सरणियों वी और ग डबल सरणियों हैं, तो आप सिर्फ aux स्मृति कंस्ट्रक्टर्स उपयोग कर सकते हैं

  • चटाई (aux_mem *, n_rows, n_cols, copy_aux_mem = सत्य, सख्त = सत्य)

    लिखने योग्य सहायक स्मृति से डेटा का उपयोग करके एक मैट्रिक्स बनाएं। डिफ़ॉल्ट रूप से मैट्रिक्स अपनी याददाश्त आवंटित करता है और सहायक स्मृति (सुरक्षा के लिए) से डेटा कॉपी करता है। हालांकि, अगर copy_aux_mem को गलत पर सेट किया गया है, तो मैट्रिक्स सीधे सहायक स्मृति का उपयोग करेगा (यानी कोई प्रतिलिपि नहीं)। यह तेज़ है, लेकिन खतरनाक हो सकता है जब तक आप नहीं जानते कि आप क्या कर रहे हैं!

सख्त चर copy_aux_mem गलत पर सेट है तभी (यानी। मैट्रिक्स सीधे सहायक स्मृति उपयोग कर रहा है) के प्रभाव में आता है। यदि सख्त सत्य पर सेट किया गया है, तो मैट्रिक्स अपने जीवनकाल के लिए सहायक स्मृति से बंधेगा; मैट्रिक्स में तत्वों की संख्या को बदला नहीं जा सकता (सीधे या अप्रत्यक्ष रूप से)। यदि सख्त को गलत पर सेट किया गया है, तो मैट्रिक्स अपने जीवनकाल के लिए सहायक स्मृति से बंधे नहीं होगा, यानी, मैट्रिक्स का आकार बदला जा सकता है। यदि तत्वों की अनुरोधित संख्या सहायक स्मृति के आकार से अलग है, तो नई मेमोरी आवंटित की जाएगी और सहायक स्मृति का अब उपयोग नहीं किया जाएगा।

  • चटाई (स्थिरांक aux_mem *, n_rows, n_cols)

केवल पढ़ने के लिए सहायक स्मृति से डेटा कॉपी करके एक मैट्रिक्स बनाएँ।

आप इस तरह अपने स्रोत डेटा कॉपी करके अपने matrixes बना सकते हैं जिसका मतलब है:

mat A_Copy(v, SIZE, 1); 
mat B_Copy(c, SIZE, 1); 

या आप वास्तव में स्मृति आप पहले से ही अपने सरणियों के लिए आवंटित है पुन: उपयोग केवल पढ़ने के लिए matrixes बनाने के लिए कर सकते हैं की तरह है, इस:

mat A_InPlace(v, SIZE, 1, /*copy_aux_mem*/false, /*strict*/true); 
mat B_InPlace(c, SIZE, 1, /*copy_aux_mem*/false, /*strict*/true); 

अगर आप वैक्टर

vec A_Vec_Copy(v, SIZE); 
vec B_Vec_Copy(c, SIZE); 
का उपयोग और भी आसान हो जाता है

या:

vec A_Vec_InPlace(v, SIZE, false, true); 
vec B_Vec_InPlace(c, SIZE, false, true); 
+0

हम सी ++ 11 प्रारंभिक सूची का उपयोग कैसे कर सकते हैं? – qed

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