MatLisp - a Matrix package for CMU Lisp What is MatLisp? ---------------- MatLisp is a set of CLOS classes for handling matrices with real-valued or complex-valued elements. The classes allow a simple and consistent interface to matrix operations such as add, subtrace, multiple, and divide. However, a implementation of the matrix operations entirely in Lisp could have been done, but such an approach completely ignores the excellent packages available for matrices. In particular, LAPACK is used to handle the matrix operations. Thus, MatLisp supplies a set of wrapper classes and functions around the core LAPACK routines. Why MatLisp? ------------ While MatLisp essentially supplies a wrapper around the LAPACK routines, it is more than that. You have at your disposable the complete Lisp language and CLOS. This allows you to write clean, object-oriented code that can utilize the LAPACK matrix routines. Thus, you can think about your problem in the natural way instead of trying to force-fit your problem in matrices, like some other packages do. What About Matlab, Rlab, Octave, etc? ------------------------------------- While all of these are good at what they do, they all have a fundamental limitation: Everything is a matrix. You have no alternative. Either you make your problem fit into a matrix, or you can't use these languages. The exception is Rlab, which does have simple lists in addition to matrices. However, that's as far as it goes. MatLisp frees you from this limitation---you have at your disposal, the complete functionality of Common Lisp, including structures, hash tables, lists, arrays, and the Common Lisp Object System (CLOS). MatLisp adds to this richness by giving you a matrix fast class based on the well-known and well-tested LAPACK library. Thus, you can think about your problem in the most natural way, without having to force everything into a matrix. If the natural way, you can then use a matrix, and achieve performance close to Matlab and the other languages. How to Install -------------- See the file INSTALL. How to Use ---------- This is very short. Here is a list of available routines make-float-matrix create a float matrix (make-float-matrix n m) creates an n x m matrix initialize to zero. (make-float-matrix #2a(...)) creates a matrix with the same dimensions as the array and initializes the matrix with those elements. (make-float-matrix '((...) (...) ...)) creats a matrix of the appropriate dimensions and initializes it to the elements in the list. make-complex-matrix create a complex matrix (make-complex-matrix n m) creates an n x m matrix initialize to zero. (make-complex-matrix #2a(...)) creates a matrix with the same dimensions as the array and initializes the matrix with those elements. (make-complex-matrix '((...) (...) ...)) creats a matrix of the appropriate dimensions and initializes it to the elements in the list. [] create a float or complex matrix [1 2 ; 3 4] creates a 2x2 matrix [[1 3]' [2 4]'] creates the same 2x2 matrix [[1 2] ; [3 4]] creates the same 2x2 matrix matrix-ref access the elements of the matrix. Indices are 0-based. (matrix-ref mat r) access the array as if it were really 1-dimensional. Matrix is stored in column-major order. (matrix-ref mat r c) access element r,c (matrix-ref mat ridx) if ridx is a matrix or a sequence, ridx is used as the indices to extract the corresponding elements from the matrix. m+ add two matrices m- subtract two matrices. If only one matrix is given, return the negative of the matrix. m* multiply two matrices m/ divide two matrices. (m/ a b) means the same as inv(B)*A. (m/ a) is the same as inv(A).