上三角矩阵顺序索引推导对应行号与列号的实现方法
上三角矩阵索引转行列号的计算方案
以下方案默认场景为n阶方阵的上三角区域(包含主对角线,满足列号 ≥ 行号),按行优先顺序遍历,索引从0开始计数,如果你的遍历规则、索引起点、行列号规则不同,可以基于以下逻辑调整。
核心公式推导
- 对于n阶方阵,第r行(行号从0开始)的上三角元素共有
n - r个 - 前r行的总元素数计算公式:
total_before_r = r * n - r * (r - 1) / 2 - 行号推导:通过解二次方程取整得到,公式为:
row = floor( (2 * n + 1 - sqrt( (2 * n + 1) * (2 * n + 1) - 8 * index )) / 2 ) - 列号推导:用索引减去前r行总元素数,再加上行号即可得到当前列号:
column = index - (row * n - row * (row - 1) / 2) + row
代码实现示例
对应你给出的代码框架,以n=4(对应你循环中index<9的场景,4阶上三角含对角线前3行共9个元素)为例,实现如下:
#include <cmath> // n为矩阵阶数,这里示例取4 int n = 4; for (int index = 0; index < 9; index++) { int row = (int)floor( (2 * n + 1 - sqrt( pow(2 * n + 1, 2) - 8 * index )) / 2 ); int total_before = row * n - row * (row - 1) / 2; int column = index - total_before + row; // 此处可直接使用计算得到的row、column }
常见规则调整
- 如果行列号需要从1开始计数,直接将计算得到的row、column各加1即可
- 如果是严格上三角(不包含主对角线,列号>行号),调整列号公式为
column = index - total_before + row + 1即可 - 如果遍历顺序为列优先,只需要将公式中的行、列逻辑互换即可
内容的提问来源于stack exchange,提问作者Yousef Alnaser
相关产品推荐
相关产品推荐

