What's New (Decemeber 2005) (1) New texi documentation; courtesy of Robert Dodier. (2) Added function mat_fullunblocker; a fully recursive version of mat_unblocker. (3) Added function mat_trace; a block matrix friendly function for the matrix trace. (4) Improved algorithm for matrix condition number estimation. The new version of linalg can be downloaded from http://www.unk.edu/facstaff/profiles/willisb/. A tour of new functions: (1) The file linearalgebra/conjugate.lisp has an alternative to the /eigen/conjugate function. The /eigen/conjugate function only does the substitution %i --> -%i. The conjugate function in linearalgebra is (I hope) somewhat smarter. (%o1) c:/maxima/linearalgebra/linalg.mac (%i2) declare(z,complex)$ (%i3) conjugate([z,z^2,sqrt(z)]); (%o3) [conjugate(z),conjugate(z)^2,conjugate(sqrt(z))] Off the branch cut of sqrt, conjugate and sqrt commute. Telling Maxima that z isn't on branch cut allows it to transform conjugate(sqrt(z)) --> sqrt(conjugate(z)). (%i4) assume(imagpart(z) > 0)$ (%i5) conjugate(sqrt(z)); (%o5) sqrt(conjugate(z)) (2) New functions for generating matrices: (%i6) hilbert_matrix(2); (%o6) matrix([1,1/2],[1/2,1/3]) (%i7) vandermonde_matrix([a,b]); (%o7) matrix([1,a],[1,b]) (3) A matrix kronecker_product (%i9) kronecker_product(hilbert_matrix(2), vandermonde_matrix([5,6])); (%o9) matrix([1,5,1/2,5/2],[1,6,1/2,3],[1/2,5/2,1/3,5/3],[1/2,3,1/3,2]) (4) A function that converts block matrices to unblocked matrices (%i12) matrix([matrix([4,5]), matrix([6,7])]); (%o12) matrix([matrix([4,5]),matrix([6,7])]) (%i13) mat_unblocker(%); (%o13) matrix([4,5,6,7]) (5) LU factorization There is code for LU factorization. It uses partial pivoting when the matrix is numeric. (%i1) load("linalg"); Warning - you are redefining the Maxima function RANK (%o1) c:/maxima/linearalgebra/linalg.mac (%i2) lu_factor(matrix([a,b],[c,d])); (%o2) [matrix([a,b],[c/a,d-(b*c)/a]),[1,2]] Do the LU factorization using CRE expressions. Try this using the general representation -- it is very slow. (%i4) lu_factor(vandermonde_matrix([a,b,c,d,e]),crefield)$ (%i5) m : first(%)$ (%i6) factor(product(m[i,i],i,1,5)); (%o6) (b-a)*(c-a)*(c-b)*(d-a)*(d-b)*(d-c)*(e-a)*(e-b)*(e-c)*(e-d) LU factor using CL complex numbers (%i14) w[i,j] := ?random(1.0) + %i * ?random(1.0)$ Evaluation took 0.00 seconds (0.00 elapsed) (%i15) m : genmatrix(w,100,100)$ Evaluation took 0.45 seconds (0.45 elapsed) (%i16) lu_factor(m,complexfloatfield)$ Evaluation took 1.73 seconds (1.73 elapsed) (This code will not win any speed awards.) There is also code for solving linear systems using the LU factorization (%i19) m : hilbert_matrix(5)$ (%i20) m : lu_factor(m)$ (%i21) lu_backsub(m, matrix([1],[1],[1],[1],[1])); (%o21) matrix([5],[-120],[630],[-1120],[630]) (%i22) hilbert_matrix(5) . %; (%o22) matrix([1],[1],[1],[1],[1]) (6) My spectral representation code is now included in linalg. As always, let me know how I can improve this code. Barton Willis