2012-03-12 19 views
7

मैं एक MXM त्रिकोणीय मैट्रिक्स जो निम्नलिखित रूप है के साथ काम कर रहा हूँ यह देखते हुए:, पंक्ति और एक त्रिकोणीय मैट्रिक्स के कॉलम रही सूचकांक

M = [m00 m10 m20 m30 m40] 
    [m11 m21 m31 m41 ] 
    [m22 m32 m42  ] 
    [m33 m43   ] 
    [m44    ] 

यदि यह आसान है अनुक्रमित के संदर्भ में इस तस्वीर के लिए, यह होगा इस तरह दिखेगा:

M = [0 1 3 6 10] 
    [2 4 7 11 ] 
    [5 8 12 ] 
    [9 13  ] 
    [14  ] 

मैं अनुक्रमण के इस तरह से अजीब लग सकता है पता है, लेकिन यह बहुत आसान होता है क्योंकि यह क्रम में है इस मॉड्यूल अन्य लोगों के साथ अच्छी तरह से काम करने के लिए अगर मैं अनुक्रमण प्रणाली रख सकते हैं।

मैं एक एल्गोरिदम के साथ संघर्ष कर रहा हूं जो मैट्रिक्स का एक सूचकांक और आकार लेता है जो दी गई इंडेक्स के नीचे पंक्ति और कॉलम को वापस कर सकता है। आदर्श रूप में मैं इस तरह के 2 कार्यों के लिए होता है:

int getRow (int index, int size); 
int getCol (int index, int size); 

तो getRow (7, 5)3

और getCol (7, 5) वापसी होगी वापसी होगी 1

मैं पहले से ही इस सूत्र भर में आ गए हैं, लेकिन मैं समाधान को संशोधित नहीं कर पा रहे जिस तरह से मैं अनुक्रमणित कर रहा हूं उसके लिए काम करने के लिए दिया गया है।

algorithm for index numbers of triangular matrix coefficients

+0

हाँ, आप सही हैं, मैं एक संपादन कर दूंगा। हालांकि, इसके बावजूद, मैं अभी भी इंडेक्सिंग के तरीके के अनुरूप अन्य विषय में दिए गए एल्गोरिदम को फिर से काम नहीं कर सकता। – Redek

+0

क्यों GetRow (7, 5) 3 वापस आ जाएगा? –

+0

जिस तरह से मैं अनुक्रमणित कर रहा हूं, पंक्तियां विकर्ण हैं (क्षैतिज नहीं) इसलिए पंक्ति 3 'm30, m31, m32, m33' – Redek

उत्तर

7

न्यू उत्तर

आप पा सकते हैं row और column निम्नलिखित सूत्रों का उपयोग:

int row = floor(-0.5 + sqrt(0.25 + 2 * index)); 
int triangularNumber = row * (row + 1)/2; 
int column = index - triangularNumber; 

यह काम करता है क्योंकि प्रत्येक पंक्ति में पहले आइटम है एक triangular number (0 , 1, 3, 6, 10, 15, ...)। तो सबसे बड़ा त्रिकोणीय संख्या जो index से कम है, हमें row देता है। फिर column बस index और उस त्रिकोणीय संख्या के बीच अंतर है।

इसके अलावा, ध्यान दें कि आपको M पैरामीटर की आवश्यकता नहीं है।


ओल्ड उत्तर

इस कोड को आप दोनों row और index की column दे देंगे।

int triangularNumber = 0; 
int row = 0; 
while (triangularNumber + row < index) { 
    row ++; 
    triangularNumber += row; 
} 
int column = index - triangularNumber; 
+0

बहुत बहुत धन्यवाद! ऐसा लगता है कि मैं इसे बीजगणितीय रूप से समझने की कोशिश कर रहा था जो मुझे समस्याएं पैदा कर रहा था लेकिन यह पुनरावृत्ति समाधान अच्छी तरह से काम करता है। – Redek

+0

@Redek, क्या आप वाकई मैट्रिक्स इंडेक्सिंग बदलना चाहते हैं और ओ (एन) में पंक्ति amd कॉलम ढूंढना चाहते हैं? –

+0

@ सईद अमिरी, मैं बिना किसी संदेह के एक और अधिक कुशल समाधान के लिए खुलेगा लेकिन यह समाधान अच्छी तरह से काम करता है और जिस प्रणाली के लिए मैं इसे कार्यान्वित कर रहा हूं, इस मैट्रिक्स का अधिकतम आकार केवल कुछ हज़ार होगा जो मेरी राय में होगा बहुत नगण्य है। ऐसा कहा जा रहा है कि, मैं निश्चित रूप से अपने फायदे के लिए अन्य समाधानों का स्वागत करता हूं और यहां तक ​​कि उन लोगों के लिए भी जो एक समान समस्या में चल रहे हैं लेकिन ओ (एन) सीमा को बर्दाश्त नहीं कर सकते हैं। – Redek

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