我正在使用下三角矩阵,下面的函数计算这种矩阵的行索引。如何在执行时间方面对其进行优化?
三角矩阵最多可容纳N (N + 1) / 2
个非零元素(其中N
是矩阵维度 - N x N
)。
我有一组数字0, 1, 2, ..., N (N + 1) / 2 - 1
,我必须计算矩阵行索引。
我目前的解决方案:
inline
unsigned int calc_row(unsigned int i)
{
return static_cast<unsigned int>(floor(sqrt(static_cast<double>(0.25 + 2 * i)) - 0.5));
}
// example:
calc_row(0) == 0;
calc_row(1) == 1;
calc_row(2) == 1;
calc_row(3) == 2;
calc_row(4) == 2;
calc_row(5) == 2;
问题:
1)您认为我目前的解决方案是否对性能友好?
2)如果不是,我如何优化它(在功能执行时间方面)?
如果您认为计算行索引的替代方法会表现得更好,我就可以了。不幸的是lookup table
在我的情况下不是一个选项。
编辑#1:
我刚才有一个想法:有没有办法制作lookup table
的模板元编程版本?在编译时生成行号的方法可以证明是一个重要的优化。在我的情况下,最大的unsigned int i
大约是1000万。
编辑#2:
我编辑了整个问题,因为它引起了很大的混乱。对此我很抱歉。
编辑#3:
calc_row()
计算公式:(sqrt(1 + 8 * i) - 1) / 2
这是二次方程x(x + 1) / 2 = i
的解。其中i
是行索引。
这种解决方案的主要思想在于具有对角线的三角矩阵的线性指数可以计算为:i (i + 1) / 2 + j
。其中i
是行索引,j
是列索引。