2016-12-03 153 views
0

我有idxs:如何將三角形矩陣索引轉換爲行,列座標?

1,2,3,4,5,6,7,8,9,10,11,12,13,14,15...ect. 

這是在矩陣節點的指標(包括對角線元素):

1,1 
2,1 2,2 
3,1 3,2 3,3 
4,1 4,2 4,3 4,4 
5,1 5,2 5,3 5,4 5,5 
6,1 6,2 6,3 6,4 6,5 6,6 
etc.. 

1 
2 3 
4 5 6 
7 8 9 10 
11 12 13 14 15 
16 17 18 19 20 21 
etc.... 

,我需要得到I,J從thees指標座標

當我需要計算座標時,我只有一個idx,不能訪問其他人。

回答

2

都沒有得到優化:

int j = idx; 
int i = 1; 

while(j > i) { 
    j -= i++; 
} 

優化:

int i = std::ceil(std::sqrt(2 * idx + 0.25) - 0.5); 
int j = idx - (i-1) * i/2; 

這裏是示範:

您正在尋找這樣我:

sumRange(1, i-1) < idx && idx <= sumRange(1, i) 

當sumRange(min,max)之和爲min和max之間的整數時,它們都包含在內。 但既然你知道:

sumRange(1, i) = i * (i + 1)/2 

然後,你必須:對於j協調和不正確

idx <= i * (i+1)/2 
=> idx <= i * (i+1) 
=> 2 * idx <= i² + i + 1/4 - 1/4 
=> 2 * idx + 1/4 <= (i + 1/2)² 
=> sqrt(2 * idx + 1/4) - 1/2 <= i 
+0

我只是檢查公式,但我很好地工作。我會盡力弄清楚。 – Martin877

+1

我想通了。對於j的正確的eq是:idx - i *(i + 1)/ 2 + i,沒有+ i在最後是j座標反轉和負。可能只是錯字thx。 – Martin877

+0

這確實是一個錯字,thx;)我寫了'i *(i + 1)/ 2'而不是'(i-1)* i/2'。我只是糾正它。 –