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