A challenging problem: how to obtain a semi-lower triangular matrix from a general matrix?
Ältere Kommentare anzeigen
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 Kommentare
@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)
am 25 Sep. 2018
What is the rationale behind your re-ordering procedure?
Bruno Luong
am 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
am 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
am 26 Sep. 2018
Bearbeitet: Benson Gou
am 26 Sep. 2018
OCDER
am 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
am 26 Sep. 2018
Bruno Luong
am 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
am 26 Sep. 2018
Bearbeitet: Benson Gou
am 26 Sep. 2018
Stephen23
am 27 Sep. 2018
@Benson Gou: please do not close questions that already have answers.
Benson Gou
am 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
am 1 Okt. 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
am 9 Okt. 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.
Antworten (1)
OCDER
am 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 Kommentare
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
am 25 Sep. 2018
The question is can you do better?
Bruno Luong
am 25 Sep. 2018
Bearbeitet: Bruno Luong
am 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
am 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
am 26 Sep. 2018
Benson Gou
am 26 Sep. 2018
Kategorien
Mehr zu Programming finden Sie in Hilfe-Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
