Re: Matrix rank [message #57533] |
Fri, 14 December 2007 09:26  |
d.poreh
Messages: 406 Registered: October 2007
|
Senior Member |
|
|
On Dec 14, 5:28 pm, Vince Hradil <hrad...@yahoo.com> 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
>
> Does anyone else read the Help??????- Hide quoted text -
>
> - Show quoted text -
Huuum!!! what about NORM?
|
|
|
|
|
|
Re: Matrix rank [message #57537 is a reply to message #57536] |
Fri, 14 December 2007 08:28   |
Vince Hradil
Messages: 574 Registered: December 1999
|
Senior Member |
|
|
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
Does anyone else read the Help??????
|
|
|
|
|
Re: Matrix rank [message #57542 is a reply to message #57541] |
Fri, 14 December 2007 07:42   |
Wox
Messages: 184 Registered: August 2006
|
Senior Member |
|
|
On Fri, 14 Dec 2007 06:35:11 -0800 (PST), Vince Hradil
<hradilv@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
|
|
|
|
|
|
Re: Matrix rank [message #57620 is a reply to message #57537] |
Fri, 14 December 2007 10:06  |
Steve Eddins
Messages: 9 Registered: July 2001
|
Junior Member |
|
|
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 Eddins
http://blogs.mathworks.com/steve/
|
|
|
Re: Matrix rank [message #57622 is a reply to message #57533] |
Fri, 14 December 2007 09:49  |
Vince Hradil
Messages: 574 Registered: December 1999
|
Senior Member |
|
|
On Dec 14, 11:26 am, d.po...@gmail.com wrote:
> On Dec 14, 5:28 pm, Vince Hradil <hrad...@yahoo.com> 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
>
>> Does anyone else read the Help??????- Hide quoted text -
>
>> - Show quoted text -
>
> Huuum!!! what about NORM?
Well...
2-norm would be the maximum Singular Value: max(w)
trace norm would be the sum of the SVs: total(w)
Frobenius norm would be the sqrt of the sum of the squares of the SVs:
sqrt(total(w*w))
I think... see: http://en.wikipedia.org/wiki/Singular_value_decomposition
|
|
|