| Re: Matrix rank [message #57618 is a reply to message #57548] |
Fri, 14 December 2007 10:17  |
d.poreh
Messages: 406 Registered: October 2007
|
Senior Member |
|
|
On Dec 14, 7:06 pm, Steve Eddins <Steve.Edd...@mathworks.com> wrote:
> Vince Hradil wrote:
>> On Dec 14, 9:42 am, Wox <nom...@hotmail.com> wrote:
>>> On Fri, 14 Dec 2007 06:35:11 -0800 (PST), Vince Hradil
>
>>> <hrad...@yahoo.com> wrote:
>>>> IDL can do SVD, can you get the rank from that? Look up SVDC in the
>>>> docs.
>>> I could do this, but maybe there's a better way?
>
>>> ; A: integers
>>> ; B: floats
>>> A = [[ 0,0,1], $
>>> [ 0,1,0], $
>>> [ 0,0,0]]
>>> B = [0.25,0.5,1]
>
>>> ; Decompose A
>>> SVDC, A, W, U, V
>>> ; Solve A.X=B
>>> X=SVSOL(U, W, V, B)
>
>>> ; Check
>>> B2=A##X
>>> ind=where(total(abs(A),1,/pres) ne 0)
>
>>> if array_equal(B[ind],B2[ind]) then print,X
>
>> Well, w contains the singular values, the number of these that are non-
>> zero will be the rank:
>> idx = where(w ne 0, rank)
>> print, rank
>> 2
>
> Since this is all in floating-point, it's appropriate to use a tolerance
> instead of comparing exactly with 0. See, for example, the algorithm
> used in the MATLAB rank function, which uses a tolerance based on the
> size of the matrix and the maximum singular value. It's described here:
>
> http://www.mathworks.com/access/helpdesk/help/techdoc/ref/ra nk.html
>
> I assume this is straightforward to express in IDL.
>
> ---
> Steve Eddinshttp://blogs.mathworks.com/steve/- Hide quoted text -
>
> - Show quoted text -
but in MATLAB:
tol = max(size(A)) * norm(A) * eps.
why?
|
|
|
|