.. highlight:: lua .. include:: .. currentmodule:: matrix Linear Algebra ============== Functions --------- GSL Shell gives access to some functions of linear algebra based on GSL itself or on the BLAS routines. .. function:: inv(m) Returns the inverse of the matrix m. .. function:: solve(A, b) Solve the square system A x = b where A is a square matrix, b is a column matrix. It returns the solution x of the system. .. function:: svd(m) A general rectangular M-by-N matrix A has a singular value decomposition (SVD) into the product of an M-by-N orthogonal matrix U, an N-by-N diagonal matrix of singular values S and the transpose of an N-by-N orthogonal square matrix V, .. math:: A = U \Sigma V^T The singular values |sgr|\ :sub:`i` = |Sgr|\ :sub:`ii` are all non-negative and are generally chosen to form a non-increasing sequence |sgr|\ :sub:`1` >= |sgr|\ :sub:`2` >= ... >= |sgr|\ :sub:`N` >= 0. The singular value decomposition of a matrix has many practical uses. The condition number of the matrix is given by the ratio of the largest singular value to the smallest singular value. The presence of a zero singular value indicates that the matrix is singular. The number of non-zero singular values indicates the rank of the matrix. In practice singular value decomposition of a rank-deficient matrix will not produce exact zeroes for singular values, due to finite numerical precision. Small singular values should be edited by choosing a suitable tolerance. For a rank-deficient matrix, the null space of A is given by the columns of V corresponding to the zero singular values. Similarly, the range of A is given by columns of U corresponding to the non-zero singular values. Note that the routines here compute the "thin" version of the SVD with U as M-by-N orthogonal matrix. This allows in-place computation and is the most commonly-used form in practice. Mathematically, the "full" SVD is defined with U as an M-by-M orthogonal matrix and S as an M-by-N diagonal matrix (with additional rows of zeros). This function returns three values, in the order, U, |Sgr|, V. So you can write something like this:: u, s, v = svd(m)