我正在使用MxM三角矩阵,其形式如下:
M = [m00 m10 m20 m30 m40]
[m11 m21 m31 m41 ]
[m22 m32 m42 ]
[m33 m43 ]
[m44 ]
Run Code Online (Sandbox Code Playgroud)
如果根据索引更容易想象这一点,它看起来像这样:
M = [0 1 3 6 10]
[2 4 7 11 ]
[5 8 12 ]
[9 13 ]
[14 ]
Run Code Online (Sandbox Code Playgroud)
我知道这种索引方式可能看起来很奇怪,但如果我能保持索引系统的原样,那么这个模块可以很好地与其他模块配合使用会更容易.
我正在努力学习一种算法,该算法采用矩阵的索引和大小,可以返回给定索引所属的行和列.理想情况下,我将有两个功能,如:
int getRow (int index, int size);
int getCol (int index, int size);
Run Code Online (Sandbox Code Playgroud)
所以 getRow (7, 5)会回来3
并 getCol (7, 5)会回来1
我已经遇到过这个帖子,但我似乎无法修改那里的解决方案,因为我正在编写索引的方式.
新答案
您可以找到row并column使用以下公式:
int row = floor(-0.5 + sqrt(0.25 + 2 * index));
int triangularNumber = row * (row + 1) / 2;
int column = index - triangularNumber;
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为每行中的第一项是三角形数字(0,1,3,6,10,15 ......).所以最低的三角形数字低于index我们row.然后column就是index三角数和三角数之间的区别.
另请注意,您不需要参数M.
老答案
该代码就会给你带来的row和column的index.
int triangularNumber = 0;
int row = 0;
while (triangularNumber + row < index) {
row ++;
triangularNumber += row;
}
int column = index - triangularNumber;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1447 次 |
| 最近记录: |