c++ - 如何将三角矩阵索引转换为行、列坐标?

标签 c++ math matrix linear-algebra triangular

我有这些索引:

1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,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 坐标:

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...

当我需要计算坐标时,我只有一个索引,无法访问其他索引。

最佳答案

根本没有优化:

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) 对最小值和最大值之间的整数求和时,两者都包含在内。 但是既然你知道了:

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

那么你有:

idx <= i * (i+1) / 2
=> 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

关于c++ - 如何将三角矩阵索引转换为行、列坐标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40950460/

相关文章:

c# - 你将如何声明 DLL 导入签名?

将负数向量提升为 R 中的分数指数

python - 从字典中的值列表创建矩阵

Python - 矩阵外积

java - 从文本字段矩阵获取文本

c++ - 在 C++ 中使用 cin 时逗号有什么作用

c++ - C++ 标准中的适配器是什么?它与适配器设计模式有何关系?

c++ - 为什么我可以捕获一个对象或 dynamic_cast 即使它的 std::type_info 对象不同?

algorithm - 重心坐标下三角点检验的数值稳定性

c# - 从顶点组合中找到最小的不规则多边形(性能关键)