I am working with a MxM triangular matrix which has the following form:
M = [m00 m10 m20 m30 m40]
[m11 m21 m31 m41 ]
[m22 m32 m42 ]
[m33 m43 ]
[m44 ]
If it's easier to picture this in terms of indexes, it would look like this:
M = [0 1 3 6 10]
[2 4 7 11 ]
[5 8 12 ]
[9 13 ]
[14 ]
I know this way of indexing might look odd but it would be much easier if I could keep the indexing system as it is in order for this module to work well with others.
I am struggling with an algorithm that takes an index and size of the matrix that can return the row and column that the given index falls under. Ideally I would have 2 functions such as these:
int getRow (int index, int size);
int getCol (int index, int size);
So getRow (7, 5)
would return 3
And getCol (7, 5)
would return 1
I have come across this thread already but I cannot seem to modify the solution given there to work for the way I am indexing.
algorithm for index numbers of triangular matrix coefficients
In the mathematical discipline of linear algebra, a triangular matrix is a special kind of square matrix. A square matrix is called lower triangular if all the entries above the main diagonal are zero. Similarly, a square matrix is called upper triangular if all the entries below the main diagonal are zero.
If U is an n × n upper-triangular matrix, we know how to solve the linear system Ux = b using back substitution. In fact, this is the final step in the Gaussian elimination algorithm that we discussed in Chapter 2. Compute the value of xn = bn/unn, and then insert this value into equation (n − 1) to solve for xn−1.
Description. Returns a matrix of integers indicating their row number in a matrix-like object, or a factor indicating the row labels.
New Answer
You can find the row
and column
using the following formulas:
int row = floor(-0.5 + sqrt(0.25 + 2 * index));
int triangularNumber = row * (row + 1) / 2;
int column = index - triangularNumber;
This works because the first item in each row is a triangular number (0, 1, 3, 6, 10, 15, ...). So the biggest triangular number that is lower than index
gives us the row
. Then column
is simply the difference between index
and that triangular number.
Also, note that you don't need the parameter M
.
Old Answer
This code will give you both the row
and column
of index
.
int triangularNumber = 0;
int row = 0;
while (triangularNumber + row < index) {
row ++;
triangularNumber += row;
}
int column = index - triangularNumber;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With