M. Edward (Ed) Borasky
7/30/2006 11:10:00 PM
M. Edward (Ed) Borasky wrote:
> Nuralanur@aol.com wrote:
>> Dear Ed,
>>
>> thank you for responding.
>> Well, I tried transposing as you said too, but then I lost
>> confidence in the algorithm implemented there, because
>>
>> for m=[[10,5,-10],[2,-11,10]].to_gsl_matrix, I then get
>> a matrix u of size (3,2), (it should be 3,3), and u*u.transposed
>> is
>> [ 8.889e-001 -2.222e-001 -2.222e-001 -2.222e-001 5.556e-001
>> -4.444e-001 -2.222e-001 -4.444e-001 5.556e-001 ],
>>
>> so nowhere near a unit matrix, either ...
>>
>> With respect to the sizes, I am expecting to be able to keep
>> (m1,m2) somewhere in the range of 50 or below each.
>>
>> Best regards,
>>
>> Axel
>
> Here's what I get from R:
>
> > m=matrix(c(10, 5 ,-10 ,2 ,-11 ,10), nrow=3, ncol=2)
> > m
> [,1] [,2]
> [1,] 10 2
> [2,] 5 -11
> [3,] -10 10
> > svd(m)
> $d
> [1] 18.973666 9.486833
>
> $u
> [,1] [,2]
> [1,] -0.2981424 8.944272e-01
> [2,] -0.5962848 -4.472136e-01
> [3,] 0.7453560 -1.489694e-16
>
> $v
> [,1] [,2]
> [1,] -0.7071068 0.7071068
> [2,] 0.7071068 0.7071068
>
>
>
> > m=t(m)
> > m
> [,1] [,2] [,3]
> [1,] 10 5 -10
> [2,] 2 -11 10
> > svd(m)
> $d
> [1] 18.973666 9.486833
>
> $u
> [,1] [,2]
> [1,] -0.7071068 0.7071068
> [2,] 0.7071068 0.7071068
>
> $v
> [,1] [,2]
> [1,] -0.2981424 8.944272e-01
> [2,] -0.5962848 -4.472136e-01
> [3,] 0.7453560 -1.859678e-16
Oh ... I see what's up now. m is 3x2. Thus its rank must be 2 or less.
So we do the svd (the first one above) and get a 3x2 u, which is
correct. Now multiply u.transpose by u. In R, that's
> m
[,1] [,2]
[1,] 10 2
[2,] 5 -11
[3,] -10 10
> svd=svd(m)
> svd
$d
[1] 18.973666 9.486833
$u
[,1] [,2]
[1,] -0.2981424 8.944272e-01
[2,] -0.5962848 -4.472136e-01
[3,] 0.7453560 -1.489694e-16
$v
[,1] [,2]
[1,] -0.7071068 0.7071068
[2,] 0.7071068 0.7071068
> t(svd$u) %*% svd$u
[,1] [,2]
[1,] 1.000000e+00 -1.275693e-16
[2,] -1.275693e-16 1.000000e+00
>
See if you get the same things when you run it in Ruby/GSL.