Module: sage.matrix.matrix_modn_sparse
Sparse matrices over
for
small.
This is a compiled implementation of sparse matrices over
for
small.
TODO: - move vectors into a pyrex vector class - add _add_ and _mul_ methods.
sage: a = matrix(Integers(37),3,3,range(9),sparse=True); a [0 1 2] [3 4 5] [6 7 8] sage: type(a) <type 'sage.matrix.matrix_modn_sparse.Matrix_modn_sparse'> sage: parent(a) Full MatrixSpace of 3 by 3 sparse matrices over Ring of integers modulo 37 sage: a^2 [15 18 21] [ 5 17 29] [32 16 0] sage: a+a [ 0 2 4] [ 6 8 10] [12 14 16] sage: b = a.new_matrix(2,3,range(6)); b [0 1 2] [3 4 5] sage: a*b Traceback (most recent call last): ... TypeError: unsupported operand parent(s) for '*': 'Full MatrixSpace of 3 by 3 sparse matrices over Ring of integers modulo 37' and 'Full MatrixSpace of 2 by 3 sparse matrices over Ring of integers modulo 37' sage: b*a [15 18 21] [ 5 17 29]
sage: a == loads(dumps(a)) True sage: b == loads(dumps(b)) True
sage: a.echelonize(); a [ 1 0 36] [ 0 1 2] [ 0 0 0] sage: b.echelonize(); b [ 1 0 36] [ 0 1 2] sage: a.pivots() [0, 1] sage: b.pivots() [0, 1] sage: a.rank() 2 sage: b.rank() 2 sage: a[2,2] = 5 sage: a.rank() 3
Class: Matrix_modn_sparse
Functions: density,
matrix_from_columns,
matrix_from_rows,
rank,
swap_rows,
transpose,
visualize_structure
) |
Return the density of self.
By density we understand the ration of the number of nonzero positions and the self.nrows() * self.ncols(), i.e. the number of possible nonzero positions.
First, note that the density parameter does not ensure the density of a matrix, it is only an upper bound.
sage: A = random_matrix(GF(127),200,200,density=0.3, sparse=True) sage: A.density() 257/1000
sage: A = matrix(QQ,3,3,[0,1,2,3,0,0,6,7,8],sparse=True) sage: A.density() 2/3
) |
Return the matrix constructed from self using columns with indices in the columns list.
sage: M = MatrixSpace(GF(127),3,3,sparse=True) sage: A = M(range(9)); A [0 1 2] [3 4 5] [6 7 8] sage: A.matrix_from_columns([2,1]) [2 1] [5 4] [8 7]
) |
Return the matrix constructed from self using rows with indices in the rows list.
Input:
sage: M = MatrixSpace(GF(127),3,3,sparse=True) sage: A = M(range(9)); A [0 1 2] [3 4 5] [6 7 8] sage: A.matrix_from_rows([2,1]) [6 7 8] [3 4 5]
) |
Compute the rank of self.
Input:
sage: A = random_matrix(GF(127),200,200,density=0.01,sparse=True) sage: r1 = A.rank(gauss=False) sage: r2 = A.rank(gauss=True) sage: r3 = A.rank(gauss='native') sage: r1 == r2 == r3 True sage: r1 155
ALGORITHM: Uses LinBox or native implementation.
REFERENCES: Jean-Guillaume Dumas and Gilles Villars. 'Computing the Rank of Large Sparse Matrices over Finite Fields'. Proc. CASC'2002, The Fifth International Workshop on Computer Algebra in Scientific Computing, Big Yalta, Crimea, Ukraine, 22-27 sept. 2002, Springer-Verlag, http://perso.ens-lyon.fr/gilles.villard/BIBLIOGRAPHIE/POSTSCRIPT/rankjgd.ps
NOTE: For very sparse matrices Gaussian elimination is faster because it barly has anything to do. If the fill in needs to be considered, 'Symbolic Reordering' is usually much faster.
) |
Return the transpose of self.
sage: A = matrix(GF(127),3,3,[0,1,0,2,0,0,3,0,0],sparse=True) sage: A [0 1 0] [2 0 0] [3 0 0] sage: A.transpose() [0 2 3] [1 0 0] [0 0 0]
) |
Write a PNG image to 'filename' which visualizes self by putting black pixels in those positions which have nonzero entries.
White pixels are put at positions with zero entries. If 'maxsize' is given, then the maximal dimension in either x or y direction is set to 'maxsize' depending on which is bigger. If the image is scaled, the darkness of the pixel reflects how many of the represented entries are nonzero. So if e.g. one image pixel actually represents a 2x2 submatrix, the dot is darker the more of the four values are nonzero.
Input:
Special Functions: __eq__,
__ge__,
__gt__,
__init__,
__le__,
__lt__,
__ne__,
_dict,
_echelon_in_place_classical,
_pickle,
_rank_linbox,
_solve_right_nonsingular_square,
_unpickle
) |
Unsafe version of the dict method, mainly for internal use. This may return the dict of elements, but as an *unsafe* reference to the underlying dict of the object. It is might be dangerous if you change entries of the returned dict.
) |
Replace self by its reduction to reduced row echelon form.
ALGORITHM: We use Gauss elimination, in a slightly intelligent way, in that we clear each column using a row with the minimum number of nonzero entries.
TODO: Implement switching to a dense method when the matrix gets dense.
) |
TESTS:
sage: M = Matrix( GF(2), [[1,1,1,1,0,0,0,0,0,0]], sparse=True ) sage: loads(dumps(M)) [1 1 1 1 0 0 0 0 0 0] sage: loads(dumps(M)) == M True
) |
See self.rank().
) |
If self is a matrix
, then this function returns a vector
or matrix
such that
. If
is a vector then
is a vector and if
is a matrix, then
is a matrix.
NOTE: In SAGE one can also write A B
for
A.solve_right(B)
, i.e., SAGE implements the ``the
MATLAB/Octave backslash operator''.
Input:
sage: A = matrix(GF(127), 3, [1,2,3,-1,2,5,2,3,1], sparse=True) sage: b = vector(GF(127),[1,2,3]) sage: x = A \ b; x (73, 76, 10) sage: A * x (1, 2, 3)
) |
See About this document... for information on suggesting changes.