我正在使用具有以下形式的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
我已经碰到过这个线程,但是我似乎无法修改那里给出的解决方案以适合我建立索引的方式。

algorithm for index numbers of triangular matrix coefficients

最佳答案

新答案

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

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

之所以有效,是因为每一行中的第一项都是triangular number(0、1、3、6、10、15,...)。因此,低于index的最大三角数为row。那么column就是index和那个三角数之间的区别。

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

旧答案

此代码将为您提供rowcolumnindex
int triangularNumber = 0;
int row = 0;
while (triangularNumber + row < index) {
    row ++;
    triangularNumber += row;
}
int column = index - triangularNumber;

10-06 05:07
查看更多