A challenging problem: how to obtain a semi-lower triangular matrix from a general matrix?
Show older comments
Dear All,
I want to convert a general sparse matrix into a semi-lower triangular matrix. For example, a given matrix A:
A=[0 0 1 -1; -1 2 1 0; 0 2 -1 -1; -1 0 0 1;-1 -1 3 -1; 0 0 1 0; 0 0 -1 1;2 0 -1 -1];

Re-order the rows and columns, A can be converted into B:
B=[1 0 0 0; 1 -1 0 0; -1 1 0 0; 0 1 -1 0; -1 -1 2 0; 1 0 -1 2; -1 -1 0 2; 3 -1 -1 -1];

My code works well but it is very slow. For a 10000 by 10000 matrix, it takes more than 1 hour. For your information, I would like to share with you my algorithm.
My algorithm:
1. For a given sparse matrix A, we count the # of non-zeros elements in all rows, and re-order the rows from top to the bottom according to their # of non-zero elements (descend).
2. Deal with the first row whose # of non-zero elements is 1 (if a row with # = 1 does not exist, we select a row for its # = 2). If this "1" occurs at column j, switch the column 1 and column j.
3. Define the sub-matrix A(2:end,2:end) as a new A and repeat the above steps until the entire matrix is done.
The above steps will lead us to matrix B.
I do not know if someone could help find a faster algorithm than mine.
So far I got replies from Bruno Luong, OCDER, Matt J, and Stephen Cobeldick. Thank them all for their big help. But this equation is still open for solution. I hope you continue to investigate this challenging and interesting problem. I am looking forward to any better ideas.
Benson
Texas, USA
16 Comments
@Benson Gou: what is the exact algorithm to get from A to B?:
A =
0 0 1 -1
-1 2 1 0
0 2 -1 -1
-1 0 0 1
-1 -1 3 -1
0 0 1 0
B =
1 0 0 0
1 -1 0 0
0 1 -1 0
1 0 -1 2
-1 -1 0 2
3 -1 -1 -1
Jos (10584)
on 25 Sep 2018
What is the rationale behind your re-ordering procedure?
Bruno Luong
on 25 Sep 2018
I believe the problem is to find permutation of rows and columns of the original matrix to get as close as possible to a lower triangular matrix.
Adam Danz
on 25 Sep 2018
The problem is not defined well enough to provide useful feedback. For example, are you just looking to take any of the non-zero values in A and just put them in any order filling the lower, left corner of B?
Benson Gou
on 26 Sep 2018
Edited: Benson Gou
on 26 Sep 2018
OCDER
on 26 Sep 2018
Just curious, what is the application of this? And is it anything related to this : https://www.mathworks.com/help/matlab/ref/lu.html ?
If you have a working algorithm that's slow, upload that code. It's easier for us to rework it to be faster than to develop an algorithm from scrap that may not work as intended.
Benson Gou
on 26 Sep 2018
Bruno Luong
on 26 Sep 2018
I must admit I don't have courage to do through the description, you speak of 'push', 'introduce', 'new', etc..
It seems to me you have some sort of specific algorithm in your mind. If you could describe what is the desired shape of the final matrix B, it would be easier for us (me) to follow.
Benson Gou
on 26 Sep 2018
Edited: Benson Gou
on 26 Sep 2018
Stephen23
on 27 Sep 2018
@Benson Gou: please do not close questions that already have answers.
Benson Gou
on 27 Sep 2018
@Benson Gou: please do not close questions that already have answers.
It actually makes it harder for us to help you, if you keep asking identical questions and closing them: it is harder for us to know what questions you have been asked, what information you have already given us, what answers you have been given, and what has been discussed already.
Matt J
on 1 Oct 2018
@Benson,
It seems to me that your algorithm fails with the following input
A =
0 0 0 0
0 1 0 0
0 0 1 1
0 0 1 1
In step 3, the algorithm must eventually reduce A to its sub-matrix A(3:end,3:end)=ones(2) with no way to make that sub-matrix lower triangular.
However, it is clearly possible to make the original A lower triangular just by interchanging columns 1 and 4,
B =
0 0 0 0
0 1 0 0
1 0 1 0
1 0 1 0
Benson Gou
on 9 Oct 2018
@Benson,
Are you sure the thing you are ultimately trying to accomplish would not work just as well if you could triangularize T1*A*T2 for some pre-/post transformations T1, T2? You still haven't told us what you plan to do with the triangularized result.
Answers (1)
OCDER
on 25 Sep 2018
A = [ 0 0 1 -1;
-1 2 1 0;
0 2 -1 -1;
-1 0 0 1;
-1 -1 3 -1;
0 0 1 0];
[~, SortedRowIdx] = sort(sum(A == 0, 2), 'descend');
B = A(SortedRowIdx, :);
[~, SortedColIdx] = sort(sum(B == 0, 1), 'ascend');
B = B(:, SortedColIdx);
B =
1 0 0 0
1 -1 0 0
0 1 -1 0
1 0 -1 2
-1 -1 0 2
3 -1 -1 -1
Is the issue that this is too slow though?
7 Comments
I don't think it's reliable enough. With this matrix, it fails.
A = [ 0 0 -1 0;
-1 2 1 0;
0 2 -1 -1;
-1 0 0 1;
-1 -1 3 -1;
0 0 1 0];
The proposed algorithm gives
B =
-1 0 0 0
1 0 0 0
0 -1 0 1
1 -1 2 0
-1 0 2 -1
3 -1 -1 -1
This is not upper triangular, but will be if you do one more row interchange (rows 3 and 4).
Bruno Luong
on 25 Sep 2018
The question is can you do better?
Bruno Luong
on 25 Sep 2018
Edited: Bruno Luong
on 25 Sep 2018
Sorry I don't see it. interchange rows of what? B "incorrect"?
And also what criteria tells "B correct" is more correct than the other? Both have a cluster of 7 zeros.
Matt J
on 25 Sep 2018
Yes. Run the proposed algorithm to obtain,
B =
-1 0 0 0
1 0 0 0
0 -1 0 1
1 -1 2 0
-1 0 2 -1
3 -1 -1 -1
Now just interchange row 3 and 4 of this matrix and it will become upper triangular.
Benson Gou
on 26 Sep 2018
Benson Gou
on 26 Sep 2018
Categories
Find more on Parametric Modeling in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!