如果你想使用你使用的索引,并且你想避免循环,你可以反转索引的函数。我将使用 k 来表示线性索引,并且所有索引都是从零开始的。正如你所指出的
k = j + n*i - i*(i-1) /2。
看到我们在这里使用正整数,并且所有组合 (i,j) 映射到不同的 k 的事实意味着该函数是可逆的。我这样做的方法是首先注意
j = k - n*i + i*(i-1)/2
这样,如果您可以找到您所在的行,则该列由上述等式定义。现在考虑你想要的行,它被定义为
行 = 分钟 { 我 | k - ni + i(i-1)/2 >= 0 }。
如果你求解二次方程 k - ni + i(i-1)/2 = 0 并取 i 的底,这会给你行,即
行 = 楼层( (2n+1 - sqrt( (2n+1)^2 - 8k ) ) / 2 )
然后
j = k - 行 * n + 行 * (row-1)/2。
在伪代码中,这将是
//Given linear index k, and n the size of nxn matrix
i = floor( ( 2*n+1 - sqrt( (2n+1)*(2n+1) - 8*k ) ) / 2 ) ;
j = k - n*i + i*(i-1)/2 ;
这消除了循环的需要,并且对于大型矩阵来说会更快