[SciPy-user] Matrix sign function
Pearu Peterson
pearu at scipy.org
Wed Sep 24 07:31:57 EDT 2003
On Wed, 24 Sep 2003, Nils Wagner wrote:
> > > Anyway, I think scipy should have a generalized sign function as well.
> > >
> > > A suitable test case is the following matrix
> > >
> > > array([[ 29.2, -24.2, 69.5, 49.8, 7. ],
> > > [ -9.2, 5.2, -18. , -16.8, -2. ],
> > > [-10. , 6. , -20. , -18. , -2. ],
> > > [ -9.6, 9.6, -25.5, -15.4, -2. ],
> > > [ 9.8, -4.8, 18. , 18.2, 2. ]])
> >
> > What would be the correct result for signm(<given matrix>)?
> > signm gives:
> >
> > >>> signm(a)
> > array([[ 20.728, -6.576, 29.592, 32.88 , -6.576],
> > [ -5.808, 2.936, -8.712, -9.68 , 1.936],
> > [ -6.24 , 2.08 , -8.36 , -10.4 , 2.08 ],
> > [ -7.344, 2.448, -11.016, -11.24 , 2.448],
> > [ 6.192, -2.064, 9.288, 10.32 , -1.064]])
> >
> > Is this correct?
> >
> The result of the generalized sign algorithm is
>
> array([[ 11.94933333, -2.24533333, 15.31733333, 21.65333333,
> -2.24533333],
> [ -3.84266667, 0.49866667, -4.59066667, -7.18666667,
> 0.49866667],
> [ -4.08 , 0.56 , -4.92 , -7.6 ,
> 0.56 ],
> [ -4.03466667, 1.04266667, -5.59866667, -7.02666667,
> 1.04266667],
> [ 4.15733333, -0.50133333, 4.90933333, 7.81333333,
> -0.50133333]])
The results were different due to roundoff errors. Note that sign
function is very sensitive to that. So, here is an improved signm
that gives the above result:
>>> signm=lambda a:linalg.funm(a,lambda v:sign(around(real(v),12))+0j)
>>> signm(a)
array([[ 11.94933333, -2.24533333, 15.31733333, 21.65333333,
-2.24533333],
[ -3.84266667, 0.49866667, -4.59066667, -7.18666667,
0.49866667],
[ -4.08 , 0.56 , -4.92 , -7.6 , 0.56
],
[ -4.03466667, 1.04266667, -5.59866667, -7.02666667,
1.04266667],
[ 4.15733333, -0.50133333, 4.90933333, 7.81333333,
-0.50133333]])
Pearu
More information about the SciPy-User
mailing list