得到三角形矩阵的行和列,给定索引

  • 本文关键字:索引 三角形 arrays algorithm
  • 更新时间 :
  • 英文 :


我正在处理一个MxM三角矩阵,它具有以下形式:

M = [m00 m10 m20 m30 m40]
    [m11 m21 m31 m41    ] 
    [m22 m32 m42        ]
    [m33 m43            ]
    [m44                ]

如果用指数来描述这一点更容易,它会是这样的:

M = [0 1 3 6 10]  
    [2 4 7 11  ]
    [5 8 12    ]
    [9 13      ]
    [14        ]

我知道这种索引方式可能看起来很奇怪,但如果我能保持索引系统的原样,以便这个模块能与其他模块很好地协同工作,那会容易得多。

我正在努力研究一种算法,该算法获取一个索引和矩阵的大小,该矩阵可以返回给定索引所属的行和列。理想情况下,我会有两个这样的功能:

int getRow (int index, int size);
int getCol (int index, int size);

因此getRow (7, 5)将返回3

并且getCol (7, 5)将返回1

我已经遇到了这个线程,但我似乎无法修改给定的解决方案来适应我的索引方式。

三角矩阵系数的索引号算法

新答案

您可以使用以下公式找到rowcolumn

int row = floor(-0.5 + sqrt(0.25 + 2 * index));
int triangularNumber = row * (row + 1) / 2;
int column = index - triangularNumber;

这是因为每行中的第一项是一个三角数(0,1,3,6,10,15,…)。因此,低于index的最大三角数为row。那么CCD_ 9就是CCD_。

另外,请注意,您不需要参数M


旧答案

此代码将为您提供indexrowcolumn

int triangularNumber = 0;
int row = 0;
while (triangularNumber + row < index) {
    row ++;
    triangularNumber += row;
}
int column = index - triangularNumber;

最新更新