#!/usr/bin/env python
# (C) 2000 Huaiyu Zhu <hzhu@users.sourceforge.net>. Licence: GPL
# $Id: test_basic.py,v 1.6 2000/09/13 01:52:36 hzhu Exp $
"""
Test basic operations for Matrix module
"""
from MatPy.Matrix import Matrix, r_range, zeros, ones, eye, rand, norm, mnorm
from MatPy.Matrix import max, min, cumsum, sum, mfunc, solve
from MatPy.mfuncs import expm, logm, sqrtm
import time
def tic(): global _time; _time = time.time()
def toc(): print "time lapse =", time.time() - _time
print "-"*40, "basic vector"
a = r_range(-1, 3)
print a, a.__class__
a[2] = 9
assert a.shape == (1,4)
assert a[0,2] == a[2] == 9
print "-"*40, "basic matrix"
b = zeros((2,2))
b [1,0] = 1; b[0,1] = 2
print b
print b.shape, b[0,1], b[1,0]
print 1 + b + 1
print 2 - b - 2
print 3 * b * 3
print "-"*40, "inverse matrix"
print b.I
print 4 / b
print 4 / b * b
assert norm(b.I * b - eye(2)) < 1e-15
assert norm(b.I - 1/b) < 1e-15
print "-"*40, "arithmatic, norm"
print 1.1 * Matrix(a)*2 + 2 + a
print "-"*40, "special matrices"
c = ones(a.shape) * 2 + zeros(a.shape) + rand(a.shape)
print c
print "-"*40, "transpose, multiplication"
d = -a.T
assert d.shape == (4,1)
assert norm(d.T + a) < 1e-15
print d*c, c*d
print "-"*40, "linear transform"
X = rand((9,4))
y = X * d
print y.T
print "-"*40, "eigenvalues"
C = rand((5,5))
print C
print C.eig
print "-"*40, "matrix functions:"
print "-"*40, "identity function"
print C
D = mfunc(lambda x:x, C)
print D
assert norm(D - C) < 1e-14
print "-"*40, "sqrtm, powm"
A = X.T * X
B = sqrtm(A)
print B
assert norm(B**2 - A) < 4e-14
assert norm(B*B - A) < 2e-14
print "-"*40, "expm, logm"
print expm(C)
assert logm(expm(C)), norm(logm(expm(C)) - C) < 1e-15
print "-"*40, "inverse, eye"
print A.I
assert norm(A.I * A - eye(4)) < 1e-14
print norm(A.I * A - eye(4))
print "-"*40, "solve by inverse"
tic()
A = X.T * X
b = X.T * y
d1 = (A.I * b)
toc()
e = d1 - d
assert norm(e) < 1e-13
assert mnorm(e) < 1e-13
print "-"*40, "linear equation"
tic()
d2 = solve(X , y)
toc()
assert norm(d2 - d) < 8e-14
assert norm(d2 - d1) < 8e-14
assert norm(X*d2 - y) < 2e-14
Result obtained with
>>> from MatPy.tests import test_basic
---------------------------------------- basic vector
[-1 0 1 2 ] MatPy.Matrix.Matrix
---------------------------------------- basic matrix
[ 0 2
1 0 ]
(2, 2) 2.0 1.0
[ 2 4
3 2 ]
[ 0 -2
-1 0 ]
[ 0 18
9 0 ]
---------------------------------------- inverse matrix
[ 0 1
0.5 0 ]
[ 0 4
2 0 ]
[ 4 0
0 4 ]
---------------------------------------- arithmatic, norm
[-1.2 2 30.8 8.4 ]
---------------------------------------- special matrices
[ 2.83 2.44 2.72 2.73 ]
---------------------------------------- transpose, multiplication
[ 2.83 2.44 2.72 2.73
0 0 0 0
-25.5 -22 -24.5 -24.5
-5.66 -4.88 -5.44 -5.45 ] [-27.1 ]
---------------------------------------- linear transform
[-4.71 -4.01 -5.28 -5.73 -2 -10.1 -2.5 -1.81 -7.76 ]
---------------------------------------- eigenvalues
[ 0.664 0.0771 0.0881 0.755 0.658
0.301 0.0204 0.408 0.908 0.138
0.0539 0.641 0.911 0.895 0.908
0.7 0.223 0.7 0.384 0.597
0.907 0.807 0.859 0.43 0.869 ]
[ 2.89+0j -0.591+0j 0.715+0j -0.0847+0.38j -0.0847-0.38j ]
---------------------------------------- matrix functions:
---------------------------------------- identity function
[ 0.664 0.0771 0.0881 0.755 0.658
0.301 0.0204 0.408 0.908 0.138
0.0539 0.641 0.911 0.895 0.908
0.7 0.223 0.7 0.384 0.597
0.907 0.807 0.859 0.43 0.869 ]
[ 0.664 0.0771 0.0881 0.755 0.658
0.301 0.0204 0.408 0.908 0.138
0.0539 0.641 0.911 0.895 0.908
0.7 0.223 0.7 0.384 0.597
0.907 0.807 0.859 0.43 0.869 ]
---------------------------------------- sqrtm, powm
[ 1.91 0.623 0.616 0.641
0.623 1.02 0.297 0.263
0.616 0.297 1.37 0.677
0.641 0.263 0.677 1.51 ]
---------------------------------------- expm, logm
[ 3.93 1.51 2.33 3.08 3.22
1.93 2.15 2.29 2.76 2.17
3.17 3.08 5.83 4.73 4.89
3.13 2.01 3.47 4.3 3.67
4.36 3.28 4.79 4.67 6.14 ]
---------------------------------------- inverse, eye
[ 0.774 -0.718 -0.202 -0.233
-0.718 1.69 -0.144 0.0645
-0.202 -0.144 1.17 -0.653
-0.233 0.0645 -0.653 0.977 ]
1.01899608191e-15
---------------------------------------- solve by inverse
time lapse = 0.0102770328522
---------------------------------------- linear equation
time lapse = 0.00766706466675