rank and null of sparse matrix not allowed without using full

9 views (last 30 days)
Consider the following, where A has the sparse matrix attribute.
>> rank(A)
Error using svd
Use svds for sparse singular values and vectors.
Error in rank (line 14)
s = svd(A);
>> null(A);
Error using svd
Use svds for sparse singular values and vectors.
Error in null (line 66)
[~,S,V] = svd(A,0);
Is there a way, without writing your own, to get an SVD-based null without doing null(full(A)), and SVD-based rank without doing rank(full(A))?
Note that qr and eig are allowed on a sparse matrix, but svd is not. Is there a reason for this? Yes, I can get rank and nullspace basis using qr on a sparse matrix, bit why not be allowed to use SVD-based commands without taking full of the matrix?
svds is based on eigs, which is very unreliable, so I have no interest in relying on svds in the middle of something like a nonlinear optimization. I'd for sure go with qr over svds. I'm willing to pay a computation time penalty for use of SVD instead of qr, but the "natural" penalty is jacked way up due to having to take full of the matrix.
Yhanks.

Accepted Answer

John D'Errico
John D'Errico on 29 Jun 2015
A svd will generally result in completely filled in matrices. There will be no non-zero elements in general.
So asking for a svd that does not first make the matrix a full one is a waste of time. It would be considerably slower on a sparse matrix than a full one. Immensely so in fact.
I've attached a code I wrote some years ago, rowspaces. It returns a basis for the rows of an array, as well as the null space of the rows of that matrix. It uses QR, and it does work for sparse matrices, and since it uses the pivoted QR, it will be moderately stable, I hope.
A = sprand(10,5,.1)
A =
(4,2) 0.7572
(3,3) 0.91719
(10,3) 0.75373
(3,4) 0.28584
(2,5) 0.54972
[rowsp,nullsp] = rowspaces(A)
rowsp =
(2,2) 1
(3,3) 1
(4,4) 1
(1,5) 1
nullsp =
(1,1) 1
As you can see both inputs and outputs are sparse. It allows you to provide the expected rank of the matrix, in which case it will check against the rank that it found. I make no claims about the speed of this code, since my use of it was generally for low dimensional problems.
A quick test though...
A = sprand(1000,500,.001);
tic,[rowsp,nullsp] = rowspaces(A);toc
Elapsed time is 0.092103 seconds.
tic,sp = null(full(A));toc
Elapsed time is 0.302519 seconds.
So it seems reasonably fast. Note that the nullspace here will be the transpose of what null returns, but the results should be equivalent otherwise.
  3 Comments
John D'Errico
John D'Errico on 29 Jun 2015
No. As I said, to do an svd efficiently on a sparse matrix simply won't work. So if you want the svd produced null, you need to either accept svds, or use the full matrix.
Mark Stone
Mark Stone on 30 Jun 2015
My point is that in my opinion, svd and rank should use full rather than rejecting the command.

Sign in to comment.

More Answers (0)

Categories

Find more on Linear Algebra 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!