You can create any space of either dense or sparse matrices with given number of rows and columns over any commutative or noncommutative ring.
EXAMPLES:
sage: MS = MatrixSpace(QQ,6,6,sparse=True); MS
Full MatrixSpace of 6 by 6 sparse matrices over Rational Field
sage: MS.base_ring()
Rational Field
sage: MS = MatrixSpace(ZZ,3,5,sparse=False); MS
Full MatrixSpace of 3 by 5 dense matrices over Integer Ring
TESTS:
sage: matrix(RR,2,2,sparse=True)
[0.000000000000000 0.000000000000000]
[0.000000000000000 0.000000000000000]
sage: matrix(GF(11),2,2,sparse=True)
[0 0]
[0 0]
Create with the command
MatrixSpace(base_ring , nrows [, ncols] [, sparse])
The default value of the optional argument sparse is False. The default value of the optional argument ncols is nrows.
INPUT:
OUTPUT: The unique space of all nrows x ncols matrices over base_ring.
EXAMPLES:
sage: MS = MatrixSpace(RationalField(),2)
sage: MS.base_ring()
Rational Field
sage: MS.dimension()
4
sage: MS.dims()
(2, 2)
sage: B = MS.basis()
sage: B
[
[1 0] [0 1] [0 0] [0 0]
[0 0], [0 0], [1 0], [0 1]
]
sage: B[0]
[1 0]
[0 0]
sage: B[1]
[0 1]
[0 0]
sage: B[2]
[0 0]
[1 0]
sage: B[3]
[0 0]
[0 1]
sage: A = MS.matrix([1,2,3,4])
sage: A
[1 2]
[3 4]
sage: MS2 = MatrixSpace(RationalField(),2,3)
sage: B = MS2.matrix([1,2,3,4,5,6])
sage: A*B
[ 9 12 15]
[19 26 33]
sage: M = MatrixSpace(ZZ, 10)
sage: M
Full MatrixSpace of 10 by 10 dense matrices over Integer Ring
sage: loads(M.dumps()) == M
True
Bases: sage.structure.parent_gens.ParentWithGens
The space of all nrows x ncols matrices over base_ring.
EXAMPLES:
sage: MatrixSpace(ZZ,10,5)
Full MatrixSpace of 10 by 5 dense matrices over Integer Ring
sage: MatrixSpace(ZZ,10,5).category()
Category of modules over Integer Ring
sage: MatrixSpace(ZZ,10,2^31)
... # 32-bit
ValueError: number of rows and columns must be less than 2^31 (on a 32-bit computer -- use a 64-bit computer for matrices with up to 2^63-1 rows and columns) # 32-bit
Full MatrixSpace of 10 by 2147483648 dense matrices over Integer Ring # 64-bit
sage: MatrixSpace(ZZ,2^31,10)
... # 32-bit
ValueError: number of rows and columns must be less than 2^31 (on a 32-bit computer -- use a 64-bit computer for matrices with up to 2^63-1 rows and columns) # 32-bit
Full MatrixSpace of 2147483648 by 10 dense matrices over Integer Ring # 64-bit
sage: MatrixSpace(ZZ,10,10).category()
Category of algebras over Integer Ring
sage: MatrixSpace(QQ,10).category()
Category of algebras over Rational Field
Return base extension of this matrix space to R.
INPUT:
OUTPUT: a matrix space
EXAMPLES:
sage: Mat(ZZ,3,5).base_extend(QQ)
Full MatrixSpace of 3 by 5 dense matrices over Rational Field
sage: Mat(QQ,3,5).base_extend(GF(7))
...
TypeError: no base extension defined
Returns a basis for this matrix space.
Warning
This will of course compute every generator of this matrix space. So for large matrices, this could take a long time, waste a massive amount of memory (for dense matrices), and is likely not very useful. Don’t use this on large matrix spaces.
EXAMPLES:
sage: Mat(ZZ,2,2).basis()
[
[1 0] [0 1] [0 0] [0 0]
[0 0], [0 0], [1 0], [0 1]
]
Return matrix space over R with otherwise same parameters as self.
INPUT:
OUTPUT: a matrix space
EXAMPLES:
sage: Mat(QQ,3,5).change_ring(GF(7))
Full MatrixSpace of 3 by 5 dense matrices over Finite Field of size 7
Return the module spanned by all columns of matrices in this matrix space. This is a free module of rank the number of columns. It will be sparse or dense as this matrix space is sparse or dense.
EXAMPLES:
sage: M = Mat(GF(9,'a'),20,5,sparse=True); M.column_space()
Sparse vector space of dimension 20 over Finite Field in a of size 3^2
EXAMPLES:
sage: A = matrix(ZZ, 2, [1..4], sparse=True)
sage: A.parent().construction()
(MatrixFunctor, Integer Ring)
sage: A.parent().construction()[0](QQ['x'])
Full MatrixSpace of 2 by 2 sparse matrices over Univariate Polynomial Ring in x over Rational Field
sage: parent(A/2)
Full MatrixSpace of 2 by 2 sparse matrices over Rational Field
Returns (m rows) * (n cols) of self as Integer
EXAMPLES:
sage: MS = MatrixSpace(ZZ,4,6)
sage: u = MS.dimension()
sage: u - 24 == 0
True
Returns (m row, n col) representation of self dimension
EXAMPLES:
sage: MS = MatrixSpace(ZZ,4,6)
sage: MS.dims()
(4, 6)
Return the n-th generator of this matrix space.
This doesn’t compute all basis matrices, so it is reasonably intelligent.
EXAMPLES:
sage: M = Mat(GF(7),10000,5); M.ngens()
50000
sage: a = M.10
sage: a[:4]
[0 0 0 0 0]
[0 0 0 0 0]
[1 0 0 0 0]
[0 0 0 0 0]
Returns the identity matrix in self.
self must be a space of square matrices. The returned matrix is immutable. Please use copy if you want a modified copy.
EXAMPLES:
sage: MS1 = MatrixSpace(ZZ,4)
sage: MS2 = MatrixSpace(QQ,3,4)
sage: I = MS1.identity_matrix()
sage: I
[1 0 0 0]
[0 1 0 0]
[0 0 1 0]
[0 0 0 1]
sage: Er = MS2.identity_matrix()
...
TypeError: self must be a space of square matrices
TESTS:
sage: MS1.one()[1,2] = 3
...
ValueError: matrix is immutable; please change a copy instead (i.e., use copy(M) to change a copy of M).
Returns True if matrices in self are dense and False otherwise.
EXAMPLES:
sage: Mat(RDF,2,3).is_sparse()
False
sage: Mat(RR,123456,22,sparse=True).is_sparse()
True
EXAMPLES:
sage: MatrixSpace(GF(101), 10000).is_finite()
True
sage: MatrixSpace(QQ, 2).is_finite()
False
Returns True if matrices in self are sparse and False otherwise.
EXAMPLES:
sage: Mat(GF(2011),10000).is_sparse()
False
sage: Mat(GF(2011),10000,sparse=True).is_sparse()
True
Create a matrix in self. The entries can be specified either as a single list of length nrows*ncols, or as a list of lists.
EXAMPLES:
sage: M = MatrixSpace(ZZ, 2)
sage: M.matrix([[1,0],[0,-1]])
[ 1 0]
[ 0 -1]
sage: M.matrix([1,0,0,-1])
[ 1 0]
[ 0 -1]
sage: M.matrix([1,2,3,4])
[1 2]
[3 4]
sage: M.matrix([1,2,3,4],rows=False)
[1 3]
[2 4]
Return the matrix space with given number of rows, columns and sparcity over the same base ring as self, and defaults the same as self.
EXAMPLES:
sage: M = Mat(GF(7),100,200)
sage: M.matrix_space(5000)
Full MatrixSpace of 5000 by 200 dense matrices over Finite Field of size 7
sage: M.matrix_space(ncols=5000)
Full MatrixSpace of 100 by 5000 dense matrices over Finite Field of size 7
sage: M.matrix_space(sparse=True)
Full MatrixSpace of 100 by 200 sparse matrices over Finite Field of size 7
Return the number of columns of matrices in this space.
EXAMPLES:
sage: M = Mat(ZZ['x'],200000,500000,sparse=True)
sage: M.ncols()
500000
Return the number of generators of this matrix space, which is the number of entries in the matrices in this space.
EXAMPLES:
sage: M = Mat(GF(7),100,200); M.ngens()
20000
Return the number of rows of matrices in this space.
EXAMPLES:
sage: M = Mat(ZZ,200000,500000)
sage: M.nrows()
200000
Returns the identity matrix in self.
self must be a space of square matrices. The returned matrix is immutable. Please use copy if you want a modified copy.
EXAMPLES:
sage: MS1 = MatrixSpace(ZZ,4)
sage: MS2 = MatrixSpace(QQ,3,4)
sage: I = MS1.identity_matrix()
sage: I
[1 0 0 0]
[0 1 0 0]
[0 0 1 0]
[0 0 0 1]
sage: Er = MS2.identity_matrix()
...
TypeError: self must be a space of square matrices
TESTS:
sage: MS1.one()[1,2] = 3
...
ValueError: matrix is immutable; please change a copy instead (i.e., use copy(M) to change a copy of M).
Returns a random element from this matrix space.
INPUT:
OUTPUT:
NOTES:
This method will randomize a proportion of roughly density entries in a newly allocated zero matrix.
By default, if the user sets the value of density explicitly, this method will enforce that these entries are set to non-zero values. However, if the test for equality with zero in the base ring is too expensive, the user can override this behaviour by passing the argument nonzero=False to this method.
Otherwise, if the user does not set the value of density, the default value is taken to be 1, and the option nonzero=False is passed to the randomize method.
EXAMPLES:
sage: Mat(ZZ,2,5).random_element()
[ -8 2 0 0 1]
[ -1 2 1 -95 -1]
sage: Mat(QQ,2,5).random_element(density=0.5)
[ 2 0 0 0 1]
[ 0 0 0 -1 0]
sage: Mat(QQ,3,sparse=True).random_element()
[ -1 -1 -1]
[ -3 -1/3 -1]
[ 0 -1 1]
sage: Mat(GF(9,'a'),3,sparse=True).random_element()
[ 2*a a 1]
[ 2 1 2*a + 1]
[ a 2 2]
Return the module spanned by all rows of matrices in this matrix space. This is a free module of rank the number of rows. It will be sparse or dense as this matrix space is sparse or dense.
EXAMPLES:
sage: M = Mat(ZZ,20,5,sparse=False); M.row_space()
Ambient free module of rank 5 over the principal ideal domain Integer Ring
Returns the zero matrix in self.
self must be a space of square matrices. The returned matrix is immutable. Please use copy if you want a modified copy.
EXAMPLES:
sage: z = MatrixSpace(GF(7),2,4).zero_matrix(); z
[0 0 0 0]
[0 0 0 0]
sage: z.is_mutable()
False
TESTS:
sage: MM = MatrixSpace(RDF,1,1,sparse=False); mat = MM.zero_matrix()
sage: copy(mat)
[0.0]
sage: MM = MatrixSpace(RDF,0,0,sparse=False); mat = MM.zero_matrix()
sage: copy(mat)
[]
sage: mat.is_mutable()
False
sage: MM.zero().is_mutable()
False
Returns the zero matrix in self.
self must be a space of square matrices. The returned matrix is immutable. Please use copy if you want a modified copy.
EXAMPLES:
sage: z = MatrixSpace(GF(7),2,4).zero_matrix(); z
[0 0 0 0]
[0 0 0 0]
sage: z.is_mutable()
False
TESTS:
sage: MM = MatrixSpace(RDF,1,1,sparse=False); mat = MM.zero_matrix()
sage: copy(mat)
[0.0]
sage: MM = MatrixSpace(RDF,0,0,sparse=False); mat = MM.zero_matrix()
sage: copy(mat)
[]
sage: mat.is_mutable()
False
sage: MM.zero().is_mutable()
False
Given a dictionary of coordinate tuples, return the list given by reading off the nrows*ncols matrix in row order.
EXAMPLES:
sage: from sage.matrix.matrix_space import dict_to_list
sage: d = {}
sage: d[(0,0)] = 1
sage: d[(1,1)] = 2
sage: dict_to_list(d, 2, 2)
[1, 0, 0, 2]
sage: dict_to_list(d, 2, 3)
[1, 0, 0, 0, 2, 0]
Returns True if self is an instance of MatrixSpace returns false if self is not an instance of MatrixSpace
EXAMPLES:
sage: from sage.matrix.matrix_space import is_MatrixSpace
sage: MS = MatrixSpace(QQ,2)
sage: A = MS.random_element()
sage: is_MatrixSpace(MS)
True
sage: is_MatrixSpace(A)
False
sage: is_MatrixSpace(5)
False
Given a list of entries, create a dictionary whose keys are coordinate tuples and values are the entries.
EXAMPLES:
sage: from sage.matrix.matrix_space import list_to_dict
sage: d = list_to_dict([1,2,3,4],2,2)
sage: d[(0,1)]
2
sage: d = list_to_dict([1,2,3,4],2,2,rows=False)
sage: d[(0,1)]
3
Tests inversion, determinant and is_invertible for trivial matrices.
This function is a helper to check that the inversion of trivial matrices (of size 0x0, nx0, 0xn or 1x1) is handled consistently by the various implementation of matrices. The coherency is checked through a bunch of assertions. If an inconsistency is found, an AssertionError is raised which should make clear what is the problem.
INPUT:
- ring - a ring
- sparse - a boolean
- checkrank - a boolean
OUTPUT:
- nothing if everything is correct, otherwise raise an AssertionError
- The methods determinant, is_invertible, rank and inverse are checked for
- the 0x0 empty identity matrix
- the 0x3 and 3x0 matrices
- the 1x1 null matrix [0]
- the 1x1 identity matrix [1]
If checkrank is False then the rank is not checked. This is used the check matrix over ring where echelon form is not implemented.
TODO: must be adapted to category check framework when ready (see trac #5274).
TESTS:
sage: from sage.matrix.matrix_space import test_trivial_matrices_inverse as tinv sage: tinv(ZZ, sparse=True) sage: tinv(ZZ, sparse=False) sage: tinv(QQ, sparse=True) sage: tinv(QQ, sparse=False) sage: tinv(GF(11), sparse=True) sage: tinv(GF(11), sparse=False) sage: tinv(GF(2), sparse=True) sage: tinv(GF(2), sparse=False) sage: tinv(SR, sparse=True) sage: tinv(SR, sparse=False) sage: tinv(RDF, sparse=True) sage: tinv(RDF, sparse=False) sage: tinv(CDF, sparse=True) sage: tinv(CDF, sparse=False) sage: tinv(CyclotomicField(7), sparse=True) sage: tinv(CyclotomicField(7), sparse=False) sage: tinv(QQ['x,y'], sparse=True)
TODO: As soon as rank of dense matrix over QQ[‘x,y’] is implemented, please remove the following test and the checkrank=False in the next one:
sage: MatrixSpace(QQ[‘x,y’], 3, 3, sparse=False)(1).rank() Traceback (most recent call last): ... RuntimeError: BUG: matrix pivots should have been set but weren’t, matrix parent = ‘Full MatrixSpace of 3 by 3 dense matrices over Multivariate Polynomial Ring in x, y over Rational Field’
sage: tinv(QQ[‘x,y’], sparse=False, checkrank=False)