2016-12-03 132 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'。我只是纠正它。 –

相关问题