2012-03-12 66 views
7

我與它具有以下形式的M×M個三角矩陣工作:獲得一個三角矩陣的行和列,考慮到指數

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 2012-03-12 20:41:11

+0

爲什麼getRow(7,5)會返回3? – 2012-03-12 20:48:43

+0

因爲我索引的方式,行是對角線(不是水平線),所以第3行是'm30,m31,m32,m33' – Redek 2012-03-12 20:57:15

回答

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


老回答

該代碼就會給你帶來的rowindexcolumn

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

非常感謝!看來我試圖找出代數,這是導致我的問題,但這種迭代解決方案工作同樣很好。 – Redek 2012-03-12 21:24:37

+0

@Redek,你確定你想要改變矩陣索引並找到O(n)中的行和amd列嗎? – 2012-03-12 21:29:50

+0

@Saeed Amiri,我會毫無疑問地開放一個更有效的解決方案,但是這個解決方案確實很好,對於我將要實現的系統,這個矩陣的最大尺寸只有幾千個,在我看來是相當可以忽略的。話雖如此,我當然會歡迎其他解決方案爲我自己的利益,甚至爲其他遇到類似問題但無法承擔O(n)限制的人提供幫助。 – Redek 2012-03-12 21:41:14