Matrix Spaces¶
You can create any space \(\text{Mat}_{n\times m}(R)\) 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
>>> from sage.all import *
>>> MS = MatrixSpace(QQ, Integer(6),Integer(6), sparse=True); MS
Full MatrixSpace of 6 by 6 sparse matrices over Rational Field
>>> MS.base_ring()
Rational Field
>>> MS = MatrixSpace(ZZ, Integer(3),Integer(5), sparse=False); MS
Full MatrixSpace of 3 by 5 dense matrices over Integer Ring
MS = MatrixSpace(QQ, 6,6, sparse=True); MS MS.base_ring() MS = MatrixSpace(ZZ, 3,5, sparse=False); MS
- class sage.matrix.matrix_space.MatrixSpace(base_ring, nrows, ncols, sparse, implementation)[source]¶
Bases:
UniqueRepresentation
,Parent
The space of matrices of given size and base ring.
INPUT:
base_ring
– a ringnrows
orrow_keys
– nonnegative integer; the number of rows, or a finite family of arbitrary objects that index the rows of the matrixncols
orcolumn_keys
– nonnegative integer (default:nrows
); the number of columns, or a finite family of arbitrary objects that index the columns of the matrixsparse
– boolean (default:False
); whether or not matrices are given a sparse representationimplementation
– (optional) string or matrix class; a possible implementation. Depending on the base ring, the string can be'generic'
– on any base rings'flint'
– for integers and rationals'meataxe'
– finite fields using the optional package meataxe: Library for computing with modular representations'm4ri'
– for characteristic 2 using the m4ri: fast arithmetic with dense matrices over GF(2) library'linbox-float'
– for integer mod rings up to \(2^8 = 256\)'linbox-double'
– for integer mod rings up to \(floor(2^26*sqrt(2) + 1/2) = 94906266\)'numpy'
– for real and complex floating point numbers
OUTPUT: a matrix space or, more generally, a homspace between free modules
This factory function creates instances of various specialized classes depending on the input. Not all combinations of options are implemented.
If the parameters
row_keys
orcolumn_keys
are provided, they must be finite families of objects. In this case, instances ofCombinatorialFreeModule
are created via the factory functionFreeModule()
. Then the homspace between these modules is returned.
EXAMPLES:
sage: MatrixSpace(QQ, 2) Full MatrixSpace of 2 by 2 dense matrices over Rational Field sage: MatrixSpace(ZZ, 3, 2) Full MatrixSpace of 3 by 2 dense matrices over Integer Ring sage: MatrixSpace(ZZ, 3, sparse=False) Full MatrixSpace of 3 by 3 dense matrices over Integer Ring sage: MatrixSpace(ZZ, 10, 5) Full MatrixSpace of 10 by 5 dense matrices over Integer Ring sage: MatrixSpace(ZZ, 10, 5).category() Category of infinite enumerated finite dimensional modules with basis over (Dedekind domains and euclidean domains and noetherian rings and infinite enumerated sets and metric spaces) sage: MatrixSpace(ZZ, 10, 10).category() Category of infinite enumerated finite dimensional algebras with basis over (Dedekind domains and euclidean domains and noetherian rings and infinite enumerated sets and metric spaces) sage: MatrixSpace(QQ, 10).category() Category of infinite finite dimensional algebras with basis over (number fields and quotient fields and metric spaces)
>>> from sage.all import * >>> MatrixSpace(QQ, Integer(2)) Full MatrixSpace of 2 by 2 dense matrices over Rational Field >>> MatrixSpace(ZZ, Integer(3), Integer(2)) Full MatrixSpace of 3 by 2 dense matrices over Integer Ring >>> MatrixSpace(ZZ, Integer(3), sparse=False) Full MatrixSpace of 3 by 3 dense matrices over Integer Ring >>> MatrixSpace(ZZ, Integer(10), Integer(5)) Full MatrixSpace of 10 by 5 dense matrices over Integer Ring >>> MatrixSpace(ZZ, Integer(10), Integer(5)).category() Category of infinite enumerated finite dimensional modules with basis over (Dedekind domains and euclidean domains and noetherian rings and infinite enumerated sets and metric spaces) >>> MatrixSpace(ZZ, Integer(10), Integer(10)).category() Category of infinite enumerated finite dimensional algebras with basis over (Dedekind domains and euclidean domains and noetherian rings and infinite enumerated sets and metric spaces) >>> MatrixSpace(QQ, Integer(10)).category() Category of infinite finite dimensional algebras with basis over (number fields and quotient fields and metric spaces)
MatrixSpace(QQ, 2) MatrixSpace(ZZ, 3, 2) MatrixSpace(ZZ, 3, sparse=False) MatrixSpace(ZZ, 10, 5) MatrixSpace(ZZ, 10, 5).category() MatrixSpace(ZZ, 10, 10).category() MatrixSpace(QQ, 10).category()
Some examples of square 2 by 2 rational matrices:
sage: MS = MatrixSpace(QQ, 2) sage: MS.dimension() 4 sage: MS.dims() (2, 2) sage: B = MS.basis() sage: list(B) [ [1 0] [0 1] [0 0] [0 0] [0 0], [0 0], [1 0], [0 1] ] sage: B[0,0] [1 0] [0 0] sage: B[0,1] [0 1] [0 0] sage: B[1,0] [0 0] [1 0] sage: B[1,1] [0 0] [0 1] sage: A = MS.matrix([1,2,3,4]); A [1 2] [3 4]
>>> from sage.all import * >>> MS = MatrixSpace(QQ, Integer(2)) >>> MS.dimension() 4 >>> MS.dims() (2, 2) >>> B = MS.basis() >>> list(B) [ [1 0] [0 1] [0 0] [0 0] [0 0], [0 0], [1 0], [0 1] ] >>> B[Integer(0),Integer(0)] [1 0] [0 0] >>> B[Integer(0),Integer(1)] [0 1] [0 0] >>> B[Integer(1),Integer(0)] [0 0] [1 0] >>> B[Integer(1),Integer(1)] [0 0] [0 1] >>> A = MS.matrix([Integer(1),Integer(2),Integer(3),Integer(4)]); A [1 2] [3 4]
MS = MatrixSpace(QQ, 2) MS.dimension() MS.dims() B = MS.basis() list(B) B[0,0] B[0,1] B[1,0] B[1,1] A = MS.matrix([1,2,3,4]); A
The above matrix
A
can be multiplied by a 2 by 3 integer matrix:sage: MS2 = MatrixSpace(ZZ, 2, 3) sage: B = MS2.matrix([1,2,3,4,5,6]) sage: A * B [ 9 12 15] [19 26 33]
>>> from sage.all import * >>> MS2 = MatrixSpace(ZZ, Integer(2), Integer(3)) >>> B = MS2.matrix([Integer(1),Integer(2),Integer(3),Integer(4),Integer(5),Integer(6)]) >>> A * B [ 9 12 15] [19 26 33]
MS2 = MatrixSpace(ZZ, 2, 3) B = MS2.matrix([1,2,3,4,5,6]) A * B
Using
row_keys
andcolumn_keys
:sage: MS = MatrixSpace(ZZ, ['u', 'v'], ['a', 'b', 'c']); MS Set of Morphisms from Free module generated by {'a', 'b', 'c'} over Integer Ring to Free module generated by {'u', 'v'} over Integer Ring in Category of finite dimensional modules with basis over Integer Ring
>>> from sage.all import * >>> MS = MatrixSpace(ZZ, ['u', 'v'], ['a', 'b', 'c']); MS Set of Morphisms from Free module generated by {'a', 'b', 'c'} over Integer Ring to Free module generated by {'u', 'v'} over Integer Ring in Category of finite dimensional modules with basis over Integer Ring
MS = MatrixSpace(ZZ, ['u', 'v'], ['a', 'b', 'c']); MS
Check categories:
sage: MatrixSpace(ZZ, 10, 5) Full MatrixSpace of 10 by 5 dense matrices over Integer Ring sage: MatrixSpace(ZZ, 10, 5).category() Category of infinite enumerated finite dimensional modules with basis over (Dedekind domains and euclidean domains and noetherian rings and infinite enumerated sets and metric spaces) sage: MatrixSpace(ZZ, 10, 10).category() Category of infinite enumerated finite dimensional algebras with basis over (Dedekind domains and euclidean domains and noetherian rings and infinite enumerated sets and metric spaces) sage: MatrixSpace(QQ, 10).category() Category of infinite finite dimensional algebras with basis over (number fields and quotient fields and metric spaces)
>>> from sage.all import * >>> MatrixSpace(ZZ, Integer(10), Integer(5)) Full MatrixSpace of 10 by 5 dense matrices over Integer Ring >>> MatrixSpace(ZZ, Integer(10), Integer(5)).category() Category of infinite enumerated finite dimensional modules with basis over (Dedekind domains and euclidean domains and noetherian rings and infinite enumerated sets and metric spaces) >>> MatrixSpace(ZZ, Integer(10), Integer(10)).category() Category of infinite enumerated finite dimensional algebras with basis over (Dedekind domains and euclidean domains and noetherian rings and infinite enumerated sets and metric spaces) >>> MatrixSpace(QQ, Integer(10)).category() Category of infinite finite dimensional algebras with basis over (number fields and quotient fields and metric spaces)
MatrixSpace(ZZ, 10, 5) MatrixSpace(ZZ, 10, 5).category() MatrixSpace(ZZ, 10, 10).category() MatrixSpace(QQ, 10).category()
- base_extend(R)[source]¶
Return base extension of this matrix space to R.
INPUT:
R
– ring
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)) Traceback (most recent call last): ... TypeError: no base extension defined
>>> from sage.all import * >>> Mat(ZZ, Integer(3), Integer(5)).base_extend(QQ) Full MatrixSpace of 3 by 5 dense matrices over Rational Field >>> Mat(QQ, Integer(3), Integer(5)).base_extend(GF(Integer(7))) Traceback (most recent call last): ... TypeError: no base extension defined
Mat(ZZ, 3, 5).base_extend(QQ) Mat(QQ, 3, 5).base_extend(GF(7))
- basis()[source]¶
Return a basis for this matrix space.
Warning
This will of course compute every generator of this matrix space. So for large dimensions, 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: list(Mat(ZZ,2,2).basis()) [ [1 0] [0 1] [0 0] [0 0] [0 0], [0 0], [1 0], [0 1] ]
>>> from sage.all import * >>> list(Mat(ZZ,Integer(2),Integer(2)).basis()) [ [1 0] [0 1] [0 0] [0 0] [0 0], [0 0], [1 0], [0 1] ]
list(Mat(ZZ,2,2).basis())
- cached_method(f, name=None, key=None, do_pickle=None)[source]¶
A decorator for cached methods.
EXAMPLES:
In the following examples, one can see how a cached method works in application. Below, we demonstrate what is done behind the scenes:
sage: class C: ....: @cached_method ....: def __hash__(self): ....: print("compute hash") ....: return int(5) ....: @cached_method ....: def f(self, x): ....: print("computing cached method") ....: return x*2 sage: c = C() sage: type(C.__hash__) <class 'sage.misc.cachefunc.CachedMethodCallerNoArgs'> sage: hash(c) compute hash 5
>>> from sage.all import * >>> class C: ... @cached_method ... def __hash__(self): ... print("compute hash") ... return int(Integer(5)) ... @cached_method ... def f(self, x): ... print("computing cached method") ... return x*Integer(2) >>> c = C() >>> type(C.__hash__) <class 'sage.misc.cachefunc.CachedMethodCallerNoArgs'> >>> hash(c) compute hash 5
class C: @cached_method def __hash__(self): print("compute hash") return int(5) @cached_method def f(self, x): print("computing cached method") return x*2 c = C() type(C.__hash__) hash(c)
When calling a cached method for the second time with the same arguments, the value is gotten from the cache, so that a new computation is not needed:
sage: hash(c) 5 sage: c.f(4) computing cached method 8 sage: c.f(4) is c.f(4) True
>>> from sage.all import * >>> hash(c) 5 >>> c.f(Integer(4)) computing cached method 8 >>> c.f(Integer(4)) is c.f(Integer(4)) True
hash(c) c.f(4) c.f(4) is c.f(4)
Different instances have distinct caches:
sage: d = C() sage: d.f(4) is c.f(4) computing cached method False sage: d.f.clear_cache() sage: c.f(4) 8 sage: d.f(4) computing cached method 8
>>> from sage.all import * >>> d = C() >>> d.f(Integer(4)) is c.f(Integer(4)) computing cached method False >>> d.f.clear_cache() >>> c.f(Integer(4)) 8 >>> d.f(Integer(4)) computing cached method 8
d = C() d.f(4) is c.f(4) d.f.clear_cache() c.f(4) d.f(4)
Using cached methods for the hash and other special methods was implemented in Issue #12601, by means of
CachedSpecialMethod
. We show that it is used behind the scenes:sage: cached_method(c.__hash__) <sage.misc.cachefunc.CachedSpecialMethod object at ...> sage: cached_method(c.f) <sage.misc.cachefunc.CachedMethod object at ...>
>>> from sage.all import * >>> cached_method(c.__hash__) <sage.misc.cachefunc.CachedSpecialMethod object at ...> >>> cached_method(c.f) <sage.misc.cachefunc.CachedMethod object at ...>
cached_method(c.__hash__) cached_method(c.f)
The parameter
do_pickle
can be used if the contents of the cache should be stored in a pickle of the cached method. This can be dangerous with special methods such as__hash__
:sage: class C: ....: @cached_method(do_pickle=True) ....: def __hash__(self): ....: return id(self) sage: import __main__ sage: __main__.C = C sage: c = C() sage: hash(c) # random output sage: d = loads(dumps(c)) sage: hash(d) == hash(c) True
>>> from sage.all import * >>> class C: ... @cached_method(do_pickle=True) ... def __hash__(self): ... return id(self) >>> import __main__ >>> __main__.C = C >>> c = C() >>> hash(c) # random output >>> d = loads(dumps(c)) >>> hash(d) == hash(c) True
class C: @cached_method(do_pickle=True) def __hash__(self): return id(self) import __main__ __main__.C = C c = C() hash(c) # random output d = loads(dumps(c)) hash(d) == hash(c)
However, the contents of a method’s cache are not pickled unless
do_pickle
is set:sage: class C: ....: @cached_method ....: def __hash__(self): ....: return id(self) sage: __main__.C = C sage: c = C() sage: hash(c) # random output sage: d = loads(dumps(c)) sage: hash(d) == hash(c) False
>>> from sage.all import * >>> class C: ... @cached_method ... def __hash__(self): ... return id(self) >>> __main__.C = C >>> c = C() >>> hash(c) # random output >>> d = loads(dumps(c)) >>> hash(d) == hash(c) False
class C: @cached_method def __hash__(self): return id(self) __main__.C = C c = C() hash(c) # random output d = loads(dumps(c)) hash(d) == hash(c)
- cardinality()[source]¶
Return the number of elements in
self
.EXAMPLES:
sage: MatrixSpace(GF(3), 2, 3).cardinality() 729 sage: MatrixSpace(ZZ, 2).cardinality() +Infinity sage: MatrixSpace(ZZ, 0, 3).cardinality() 1
>>> from sage.all import * >>> MatrixSpace(GF(Integer(3)), Integer(2), Integer(3)).cardinality() 729 >>> MatrixSpace(ZZ, Integer(2)).cardinality() +Infinity >>> MatrixSpace(ZZ, Integer(0), Integer(3)).cardinality() 1
MatrixSpace(GF(3), 2, 3).cardinality() MatrixSpace(ZZ, 2).cardinality() MatrixSpace(ZZ, 0, 3).cardinality()
- change_ring(R)[source]¶
Return matrix space over R with otherwise same parameters as
self
.INPUT:
R
– ring
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
>>> from sage.all import * >>> Mat(QQ, Integer(3), Integer(5)).change_ring(GF(Integer(7))) Full MatrixSpace of 3 by 5 dense matrices over Finite Field of size 7
Mat(QQ, 3, 5).change_ring(GF(7))
- characteristic()[source]¶
Return the characteristic.
EXAMPLES:
sage: MatrixSpace(ZZ, 2).characteristic() 0 sage: MatrixSpace(GF(9), 0).characteristic() # needs sage.rings.finite_rings 3
>>> from sage.all import * >>> MatrixSpace(ZZ, Integer(2)).characteristic() 0 >>> MatrixSpace(GF(Integer(9)), Integer(0)).characteristic() # needs sage.rings.finite_rings 3
MatrixSpace(ZZ, 2).characteristic() MatrixSpace(GF(9), 0).characteristic() # needs sage.rings.finite_rings
- column_space()[source]¶
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() # needs sage.rings.finite_rings Sparse vector space of dimension 20 over Finite Field in a of size 3^2
>>> from sage.all import * >>> M = Mat(GF(Integer(9),'a'), Integer(20), Integer(5), sparse=True); M.column_space() # needs sage.rings.finite_rings Sparse vector space of dimension 20 over Finite Field in a of size 3^2
M = Mat(GF(9,'a'), 20, 5, sparse=True); M.column_space() # needs sage.rings.finite_rings
- construction()[source]¶
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
>>> from sage.all import * >>> A = matrix(ZZ, Integer(2), (ellipsis_range(Integer(1),Ellipsis,Integer(4))), sparse=True) >>> A.parent().construction() (MatrixFunctor, Integer Ring) >>> A.parent().construction()[Integer(0)](QQ['x']) Full MatrixSpace of 2 by 2 sparse matrices over Univariate Polynomial Ring in x over Rational Field >>> parent(A/Integer(2)) Full MatrixSpace of 2 by 2 sparse matrices over Rational Field
A = matrix(ZZ, 2, [1..4], sparse=True) A.parent().construction() A.parent().construction()[0](QQ['x']) parent(A/2)
- diagonal_matrix(entries)[source]¶
Create a diagonal matrix in
self
using the specified elements.INPUT:
entries
– the elements to use as the diagonal entries
self
must be a space of square matrices. The length ofentries
must be less than or equal to the matrix dimensions. If the length ofentries
is less than the matrix dimensions,entries
is padded with zeroes at the end.EXAMPLES:
sage: MS1 = MatrixSpace(ZZ,4) sage: MS2 = MatrixSpace(QQ,3,4) sage: I = MS1.diagonal_matrix([1, 2, 3, 4]) sage: I [1 0 0 0] [0 2 0 0] [0 0 3 0] [0 0 0 4] sage: MS2.diagonal_matrix([1, 2]) Traceback (most recent call last): ... TypeError: diagonal matrix must be square sage: MS1.diagonal_matrix([1, 2, 3, 4, 5]) Traceback (most recent call last): ... ValueError: number of diagonal matrix entries (5) exceeds the matrix size (4) sage: MS1.diagonal_matrix([1/2, 2, 3, 4]) Traceback (most recent call last): ... TypeError: no conversion of this rational to integer
>>> from sage.all import * >>> MS1 = MatrixSpace(ZZ,Integer(4)) >>> MS2 = MatrixSpace(QQ,Integer(3),Integer(4)) >>> I = MS1.diagonal_matrix([Integer(1), Integer(2), Integer(3), Integer(4)]) >>> I [1 0 0 0] [0 2 0 0] [0 0 3 0] [0 0 0 4] >>> MS2.diagonal_matrix([Integer(1), Integer(2)]) Traceback (most recent call last): ... TypeError: diagonal matrix must be square >>> MS1.diagonal_matrix([Integer(1), Integer(2), Integer(3), Integer(4), Integer(5)]) Traceback (most recent call last): ... ValueError: number of diagonal matrix entries (5) exceeds the matrix size (4) >>> MS1.diagonal_matrix([Integer(1)/Integer(2), Integer(2), Integer(3), Integer(4)]) Traceback (most recent call last): ... TypeError: no conversion of this rational to integer
MS1 = MatrixSpace(ZZ,4) MS2 = MatrixSpace(QQ,3,4) I = MS1.diagonal_matrix([1, 2, 3, 4]) I MS2.diagonal_matrix([1, 2]) MS1.diagonal_matrix([1, 2, 3, 4, 5]) MS1.diagonal_matrix([1/2, 2, 3, 4])
Check different implementations:
sage: M1 = MatrixSpace(ZZ, 2, implementation='flint') # needs sage.libs.linbox sage: M2 = MatrixSpace(ZZ, 2, implementation='generic') sage: type(M1.diagonal_matrix([1, 2])) # needs sage.libs.linbox <class 'sage.matrix.matrix_integer_dense.Matrix_integer_dense'> sage: type(M2.diagonal_matrix([1, 2])) <class 'sage.matrix.matrix_generic_dense.Matrix_generic_dense'>
>>> from sage.all import * >>> M1 = MatrixSpace(ZZ, Integer(2), implementation='flint') # needs sage.libs.linbox >>> M2 = MatrixSpace(ZZ, Integer(2), implementation='generic') >>> type(M1.diagonal_matrix([Integer(1), Integer(2)])) # needs sage.libs.linbox <class 'sage.matrix.matrix_integer_dense.Matrix_integer_dense'> >>> type(M2.diagonal_matrix([Integer(1), Integer(2)])) <class 'sage.matrix.matrix_generic_dense.Matrix_generic_dense'>
M1 = MatrixSpace(ZZ, 2, implementation='flint') # needs sage.libs.linbox M2 = MatrixSpace(ZZ, 2, implementation='generic') type(M1.diagonal_matrix([1, 2])) # needs sage.libs.linbox type(M2.diagonal_matrix([1, 2]))
- dimension()[source]¶
Return (m rows) * (n cols) of
self
asInteger
.EXAMPLES:
sage: MS = MatrixSpace(ZZ,4,6) sage: u = MS.dimension() sage: u - 24 == 0 True
>>> from sage.all import * >>> MS = MatrixSpace(ZZ,Integer(4),Integer(6)) >>> u = MS.dimension() >>> u - Integer(24) == Integer(0) True
MS = MatrixSpace(ZZ,4,6) u = MS.dimension() u - 24 == 0
- dims()[source]¶
Return (m row, n col) representation of
self
dimension.EXAMPLES:
sage: MS = MatrixSpace(ZZ,4,6) sage: MS.dims() (4, 6)
>>> from sage.all import * >>> MS = MatrixSpace(ZZ,Integer(4),Integer(6)) >>> MS.dims() (4, 6)
MS = MatrixSpace(ZZ,4,6) MS.dims()
- from_vector(vector, order=None, coerce=True)[source]¶
Build an element of
self
from a vector.EXAMPLES:
sage: A = matrix([[1,2,3], [4,5,6]]) sage: v = vector(A); v (1, 2, 3, 4, 5, 6) sage: MS = A.parent() sage: MS.from_vector(v) [1 2 3] [4 5 6] sage: order = [(1,2), (1,0), (0,1), (0,2), (0,0), (1,1)] sage: MS.from_vector(v, order=order) [5 3 4] [2 6 1]
>>> from sage.all import * >>> A = matrix([[Integer(1),Integer(2),Integer(3)], [Integer(4),Integer(5),Integer(6)]]) >>> v = vector(A); v (1, 2, 3, 4, 5, 6) >>> MS = A.parent() >>> MS.from_vector(v) [1 2 3] [4 5 6] >>> order = [(Integer(1),Integer(2)), (Integer(1),Integer(0)), (Integer(0),Integer(1)), (Integer(0),Integer(2)), (Integer(0),Integer(0)), (Integer(1),Integer(1))] >>> MS.from_vector(v, order=order) [5 3 4] [2 6 1]
A = matrix([[1,2,3], [4,5,6]]) v = vector(A); v MS = A.parent() MS.from_vector(v) order = [(1,2), (1,0), (0,1), (0,2), (0,0), (1,1)] MS.from_vector(v, order=order)
- gen(n)[source]¶
Return the \(n\)-th generator of this matrix space.
This does not 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]
>>> from sage.all import * >>> M = Mat(GF(Integer(7)), Integer(10000), Integer(5)); M.ngens() 50000 >>> a = M.gen(10) >>> a[:Integer(4)] [0 0 0 0 0] [0 0 0 0 0] [1 0 0 0 0] [0 0 0 0 0]
M = Mat(GF(7), 10000, 5); M.ngens() a = M.10 a[:4]
- identity_matrix()[source]¶
Return the identity matrix in
self
.self
must be a space of square matrices. The returned matrix is immutable. Please usecopy
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() Traceback (most recent call last): ... TypeError: identity matrix must be square
>>> from sage.all import * >>> MS1 = MatrixSpace(ZZ,Integer(4)) >>> MS2 = MatrixSpace(QQ,Integer(3),Integer(4)) >>> I = MS1.identity_matrix() >>> I [1 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 1] >>> Er = MS2.identity_matrix() Traceback (most recent call last): ... TypeError: identity matrix must be square
MS1 = MatrixSpace(ZZ,4) MS2 = MatrixSpace(QQ,3,4) I = MS1.identity_matrix() I Er = MS2.identity_matrix()
- is_dense()[source]¶
Return whether matrices in
self
are dense.EXAMPLES:
sage: Mat(RDF,2,3).is_sparse() False sage: Mat(RR,123456,22,sparse=True).is_sparse() True
>>> from sage.all import * >>> Mat(RDF,Integer(2),Integer(3)).is_sparse() False >>> Mat(RR,Integer(123456),Integer(22),sparse=True).is_sparse() True
Mat(RDF,2,3).is_sparse() Mat(RR,123456,22,sparse=True).is_sparse()
- is_finite()[source]¶
Return whether this matrix space is finite.
EXAMPLES:
sage: MatrixSpace(GF(101), 10000).is_finite() True sage: MatrixSpace(QQ, 2).is_finite() False
>>> from sage.all import * >>> MatrixSpace(GF(Integer(101)), Integer(10000)).is_finite() True >>> MatrixSpace(QQ, Integer(2)).is_finite() False
MatrixSpace(GF(101), 10000).is_finite() MatrixSpace(QQ, 2).is_finite()
- is_sparse()[source]¶
Return whether matrices in
self
are sparse.EXAMPLES:
sage: Mat(GF(2011), 10000).is_sparse() # needs sage.rings.finite_rings False sage: Mat(GF(2011), 10000, sparse=True).is_sparse() # needs sage.rings.finite_rings True
>>> from sage.all import * >>> Mat(GF(Integer(2011)), Integer(10000)).is_sparse() # needs sage.rings.finite_rings False >>> Mat(GF(Integer(2011)), Integer(10000), sparse=True).is_sparse() # needs sage.rings.finite_rings True
Mat(GF(2011), 10000).is_sparse() # needs sage.rings.finite_rings Mat(GF(2011), 10000, sparse=True).is_sparse() # needs sage.rings.finite_rings
- matrix(x=None, **kwds)[source]¶
Create a matrix in
self
.INPUT:
x
– data to construct a new matrix from. Seematrix()
coerce
– boolean (default:True
); ifFalse
, assume without checking that the values inx
lie in the base ring
OUTPUT: a matrix in
self
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]
>>> from sage.all import * >>> M = MatrixSpace(ZZ, Integer(2)) >>> M.matrix([[Integer(1),Integer(0)],[Integer(0),-Integer(1)]]) [ 1 0] [ 0 -1] >>> M.matrix([Integer(1),Integer(0),Integer(0),-Integer(1)]) [ 1 0] [ 0 -1] >>> M.matrix([Integer(1),Integer(2),Integer(3),Integer(4)]) [1 2] [3 4]
M = MatrixSpace(ZZ, 2) M.matrix([[1,0],[0,-1]]) M.matrix([1,0,0,-1]) M.matrix([1,2,3,4])
Note that the last “flip” cannot be performed if
x
is a matrix, no matter what isrows
(it used to be possible but was fixed by Issue #10793):sage: projection = matrix(ZZ,[[1,0,0],[0,1,0]]) sage: projection [1 0 0] [0 1 0] sage: projection.parent() Full MatrixSpace of 2 by 3 dense matrices over Integer Ring sage: M = MatrixSpace(ZZ, 3 , 2) sage: M Full MatrixSpace of 3 by 2 dense matrices over Integer Ring sage: M(projection) Traceback (most recent call last): ... ValueError: inconsistent number of rows: should be 3 but got 2
>>> from sage.all import * >>> projection = matrix(ZZ,[[Integer(1),Integer(0),Integer(0)],[Integer(0),Integer(1),Integer(0)]]) >>> projection [1 0 0] [0 1 0] >>> projection.parent() Full MatrixSpace of 2 by 3 dense matrices over Integer Ring >>> M = MatrixSpace(ZZ, Integer(3) , Integer(2)) >>> M Full MatrixSpace of 3 by 2 dense matrices over Integer Ring >>> M(projection) Traceback (most recent call last): ... ValueError: inconsistent number of rows: should be 3 but got 2
projection = matrix(ZZ,[[1,0,0],[0,1,0]]) projection projection.parent() M = MatrixSpace(ZZ, 3 , 2) M M(projection)
If you really want to make from a matrix another matrix of different dimensions, use either transpose method or explicit conversion to a list:
sage: M(projection.list()) [1 0] [0 0] [1 0]
>>> from sage.all import * >>> M(projection.list()) [1 0] [0 0] [1 0]
M(projection.list())
- matrix_space(nrows=None, ncols=None, sparse=False)[source]¶
Return the matrix space with given number of rows, columns and sparsity 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
>>> from sage.all import * >>> M = Mat(GF(Integer(7)), Integer(100), Integer(200)) >>> M.matrix_space(Integer(5000)) Full MatrixSpace of 5000 by 200 dense matrices over Finite Field of size 7 >>> M.matrix_space(ncols=Integer(5000)) Full MatrixSpace of 100 by 5000 dense matrices over Finite Field of size 7 >>> M.matrix_space(sparse=True) Full MatrixSpace of 100 by 200 sparse matrices over Finite Field of size 7
M = Mat(GF(7), 100, 200) M.matrix_space(5000) M.matrix_space(ncols=5000) M.matrix_space(sparse=True)
- ncols()[source]¶
Return the number of columns of matrices in this space.
EXAMPLES:
sage: M = Mat(ZZ['x'], 200000, 500000, sparse=True) sage: M.ncols() 500000
>>> from sage.all import * >>> M = Mat(ZZ['x'], Integer(200000), Integer(500000), sparse=True) >>> M.ncols() 500000
M = Mat(ZZ['x'], 200000, 500000, sparse=True) M.ncols()
- ngens()[source]¶
Return the number of generators of this matrix space.
This is the number of entries in the matrices in this space.
EXAMPLES:
sage: M = Mat(GF(7), 100, 200); M.ngens() 20000
>>> from sage.all import * >>> M = Mat(GF(Integer(7)), Integer(100), Integer(200)); M.ngens() 20000
M = Mat(GF(7), 100, 200); M.ngens()
- nrows()[source]¶
Return the number of rows of matrices in this space.
EXAMPLES:
sage: M = Mat(ZZ, 200000, 500000) sage: M.nrows() 200000
>>> from sage.all import * >>> M = Mat(ZZ, Integer(200000), Integer(500000)) >>> M.nrows() 200000
M = Mat(ZZ, 200000, 500000) M.nrows()
- one()[source]¶
Return the identity matrix in
self
.self
must be a space of square matrices. The returned matrix is immutable. Please usecopy
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() Traceback (most recent call last): ... TypeError: identity matrix must be square
>>> from sage.all import * >>> MS1 = MatrixSpace(ZZ,Integer(4)) >>> MS2 = MatrixSpace(QQ,Integer(3),Integer(4)) >>> I = MS1.identity_matrix() >>> I [1 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 1] >>> Er = MS2.identity_matrix() Traceback (most recent call last): ... TypeError: identity matrix must be square
MS1 = MatrixSpace(ZZ,4) MS2 = MatrixSpace(QQ,3,4) I = MS1.identity_matrix() I Er = MS2.identity_matrix()
- random_element(density=None, *args, **kwds)[source]¶
Return a random element from this matrix space.
INPUT:
density
–float
orNone
(default:None
); rough measure of the proportion of nonzero entries in the random matrix; if set toNone
, all entries of the matrix are randomized, allowing for any element of the underlying ring, but if set to afloat
, a proportion of entries is selected and randomized to nonzero elements of the ring*args, **kwds
– remaining parameters, which may be passed to the random_element function of the base ring. (“may be”, since this function calls therandomize
function on the zero matrix, which need not call therandom_element
function of the base ring at all in general.)
OUTPUT: Matrix
Note
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 nonzero 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 argumentnonzero=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 optionnonzero=False
is passed to therandomize
method.EXAMPLES:
sage: M = Mat(ZZ, 2, 5).random_element() sage: TestSuite(M).run() sage: M = Mat(QQ, 2, 5).random_element(density=0.5) sage: TestSuite(M).run() sage: M = Mat(QQ, 3, sparse=True).random_element() sage: TestSuite(M).run() # needs sage.libs.pari sage: M = Mat(GF(9,'a'), 3, sparse=True).random_element() # needs sage.rings.finite_rings sage: TestSuite(M).run() # needs sage.rings.finite_rings
>>> from sage.all import * >>> M = Mat(ZZ, Integer(2), Integer(5)).random_element() >>> TestSuite(M).run() >>> M = Mat(QQ, Integer(2), Integer(5)).random_element(density=RealNumber('0.5')) >>> TestSuite(M).run() >>> M = Mat(QQ, Integer(3), sparse=True).random_element() >>> TestSuite(M).run() # needs sage.libs.pari >>> M = Mat(GF(Integer(9),'a'), Integer(3), sparse=True).random_element() # needs sage.rings.finite_rings >>> TestSuite(M).run() # needs sage.rings.finite_rings
M = Mat(ZZ, 2, 5).random_element() TestSuite(M).run() M = Mat(QQ, 2, 5).random_element(density=0.5) TestSuite(M).run() M = Mat(QQ, 3, sparse=True).random_element() TestSuite(M).run() # needs sage.libs.pari M = Mat(GF(9,'a'), 3, sparse=True).random_element() # needs sage.rings.finite_rings TestSuite(M).run() # needs sage.rings.finite_rings
- row_space()[source]¶
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
>>> from sage.all import * >>> M = Mat(ZZ,Integer(20),Integer(5),sparse=False); M.row_space() Ambient free module of rank 5 over the principal ideal domain Integer Ring
M = Mat(ZZ,20,5,sparse=False); M.row_space()
- some_elements()[source]¶
Return some elements of this matrix space.
See
TestSuite
for a typical use case.OUTPUT: an iterator
EXAMPLES:
sage: M = MatrixSpace(ZZ, 2, 2) sage: tuple(M.some_elements()) ( [ 0 1] [1 0] [0 1] [0 0] [0 0] [-1 2], [0 0], [0 0], [1 0], [0 1] ) sage: M = MatrixSpace(QQ, 2, 3) sage: tuple(M.some_elements()) ( [ 1/2 -1/2 2] [1 0 0] [0 1 0] [0 0 1] [0 0 0] [0 0 0] [0 0 0] [ -2 0 1], [0 0 0], [0 0 0], [0 0 0], [1 0 0], [0 1 0], [0 0 1] ) sage: M = MatrixSpace(SR, 2, 2) # needs sage.symbolic sage: tuple(M.some_elements()) # needs sage.symbolic ( [some_variable some_variable] [1 0] [0 1] [0 0] [0 0] [some_variable some_variable], [0 0], [0 0], [1 0], [0 1] )
>>> from sage.all import * >>> M = MatrixSpace(ZZ, Integer(2), Integer(2)) >>> tuple(M.some_elements()) ( [ 0 1] [1 0] [0 1] [0 0] [0 0] [-1 2], [0 0], [0 0], [1 0], [0 1] ) >>> M = MatrixSpace(QQ, Integer(2), Integer(3)) >>> tuple(M.some_elements()) ( [ 1/2 -1/2 2] [1 0 0] [0 1 0] [0 0 1] [0 0 0] [0 0 0] [0 0 0] [ -2 0 1], [0 0 0], [0 0 0], [0 0 0], [1 0 0], [0 1 0], [0 0 1] ) >>> M = MatrixSpace(SR, Integer(2), Integer(2)) # needs sage.symbolic >>> tuple(M.some_elements()) # needs sage.symbolic ( [some_variable some_variable] [1 0] [0 1] [0 0] [0 0] [some_variable some_variable], [0 0], [0 0], [1 0], [0 1] )
M = MatrixSpace(ZZ, 2, 2) tuple(M.some_elements()) M = MatrixSpace(QQ, 2, 3) tuple(M.some_elements()) M = MatrixSpace(SR, 2, 2) # needs sage.symbolic tuple(M.some_elements()) # needs sage.symbolic
- submodule(gens, check=True, already_echelonized=False, unitriangular=False, support_order=None, category=None, *args, **opts)[source]¶
The submodule spanned by a finite set of matrices.
INPUT:
gens
– list or family of elements ofself
check
– boolean (default:True
); whether to verify that the elements ofgens
are inself
already_echelonized
– boolean (default:False
); whether the elements ofgens
are already in (not necessarily reduced) echelon formunitriangular
– boolean (default:False
); whether the lift morphism is unitriangularsupport_order
– (optional) either something that can be converted into a tuple or a key function
If
already_echelonized
isFalse
, then the generators are put in reduced echelon form usingechelonize()
, and reindexed by \(0, 1, \ldots\).Warning
At this point, this method only works for finite dimensional submodules and if matrices can be echelonized over the base ring.
If in addition
unitriangular
isTrue
, then the generators are made such that the coefficients of the pivots are 1, so that lifting map is unitriangular.The basis of the submodule uses the same index set as the generators, and the lifting map sends \(y_i\) to \(gens[i]\).
EXAMPLES:
sage: M = MatrixSpace(QQ, 2) sage: mat = M.matrix([[1, 2], [3, 4]]) sage: X = M.submodule([mat], already_echelonized=True); X Free module generated by {0} over Rational Field sage: mat2 = M.matrix([[1, 0], [-3, 2]]) sage: X = M.submodule([mat, mat2]) sage: [X.lift(b) for b in X.basis()] [ [ 1 0] [0 1] [-3 2], [3 1] ] sage: A = matrix([[1, 1], [0, -1]]) sage: B = matrix([[0, 1], [0, 2]]) sage: X = M.submodule([A, B]) sage: Xp = M.submodule([A, B], support_order=[(0,1), (1,1), (0,0)]) sage: [X.lift(b) for b in X.basis()] [ [ 1 0] [0 1] [ 0 -3], [0 2] ] sage: [Xp.lift(b) for b in Xp.basis()] [ [2/3 1] [-1/3 0] [ 0 0], [ 0 1] ]
>>> from sage.all import * >>> M = MatrixSpace(QQ, Integer(2)) >>> mat = M.matrix([[Integer(1), Integer(2)], [Integer(3), Integer(4)]]) >>> X = M.submodule([mat], already_echelonized=True); X Free module generated by {0} over Rational Field >>> mat2 = M.matrix([[Integer(1), Integer(0)], [-Integer(3), Integer(2)]]) >>> X = M.submodule([mat, mat2]) >>> [X.lift(b) for b in X.basis()] [ [ 1 0] [0 1] [-3 2], [3 1] ] >>> A = matrix([[Integer(1), Integer(1)], [Integer(0), -Integer(1)]]) >>> B = matrix([[Integer(0), Integer(1)], [Integer(0), Integer(2)]]) >>> X = M.submodule([A, B]) >>> Xp = M.submodule([A, B], support_order=[(Integer(0),Integer(1)), (Integer(1),Integer(1)), (Integer(0),Integer(0))]) >>> [X.lift(b) for b in X.basis()] [ [ 1 0] [0 1] [ 0 -3], [0 2] ] >>> [Xp.lift(b) for b in Xp.basis()] [ [2/3 1] [-1/3 0] [ 0 0], [ 0 1] ]
M = MatrixSpace(QQ, 2) mat = M.matrix([[1, 2], [3, 4]]) X = M.submodule([mat], already_echelonized=True); X mat2 = M.matrix([[1, 0], [-3, 2]]) X = M.submodule([mat, mat2]) [X.lift(b) for b in X.basis()] A = matrix([[1, 1], [0, -1]]) B = matrix([[0, 1], [0, 2]]) X = M.submodule([A, B]) Xp = M.submodule([A, B], support_order=[(0,1), (1,1), (0,0)]) [X.lift(b) for b in X.basis()] [Xp.lift(b) for b in Xp.basis()]
- transposed()[source]¶
The transposed matrix space, having the same base ring and sparseness, but number of columns and rows is swapped.
EXAMPLES:
sage: MS = MatrixSpace(GF(3), 7, 10) sage: MS.transposed Full MatrixSpace of 10 by 7 dense matrices over Finite Field of size 3 sage: MS = MatrixSpace(GF(3), 7, 7) sage: MS.transposed is MS True sage: M = MatrixSpace(ZZ, 2, 3) sage: M.transposed Full MatrixSpace of 3 by 2 dense matrices over Integer Ring
>>> from sage.all import * >>> MS = MatrixSpace(GF(Integer(3)), Integer(7), Integer(10)) >>> MS.transposed Full MatrixSpace of 10 by 7 dense matrices over Finite Field of size 3 >>> MS = MatrixSpace(GF(Integer(3)), Integer(7), Integer(7)) >>> MS.transposed is MS True >>> M = MatrixSpace(ZZ, Integer(2), Integer(3)) >>> M.transposed Full MatrixSpace of 3 by 2 dense matrices over Integer Ring
MS = MatrixSpace(GF(3), 7, 10) MS.transposed MS = MatrixSpace(GF(3), 7, 7) MS.transposed is MS M = MatrixSpace(ZZ, 2, 3) M.transposed
- zero()[source]¶
Return the zero matrix in
self
.self
must be a space of square matrices. The returned matrix is immutable. Please usecopy
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
>>> from sage.all import * >>> z = MatrixSpace(GF(Integer(7)), Integer(2), Integer(4)).zero_matrix(); z [0 0 0 0] [0 0 0 0] >>> z.is_mutable() False
z = MatrixSpace(GF(7), 2, 4).zero_matrix(); z z.is_mutable()
- zero_matrix()[source]¶
Return the zero matrix in
self
.self
must be a space of square matrices. The returned matrix is immutable. Please usecopy
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
>>> from sage.all import * >>> z = MatrixSpace(GF(Integer(7)), Integer(2), Integer(4)).zero_matrix(); z [0 0 0 0] [0 0 0 0] >>> z.is_mutable() False
z = MatrixSpace(GF(7), 2, 4).zero_matrix(); z z.is_mutable()
- sage.matrix.matrix_space.dict_to_list(entries, nrows, ncols)[source]¶
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]
>>> from sage.all import * >>> from sage.matrix.matrix_space import dict_to_list >>> d = {} >>> d[(Integer(0),Integer(0))] = Integer(1) >>> d[(Integer(1),Integer(1))] = Integer(2) >>> dict_to_list(d, Integer(2), Integer(2)) [1, 0, 0, 2] >>> dict_to_list(d, Integer(2), Integer(3)) [1, 0, 0, 0, 2, 0]
from sage.matrix.matrix_space import dict_to_list d = {} d[(0,0)] = 1 d[(1,1)] = 2 dict_to_list(d, 2, 2) dict_to_list(d, 2, 3)
- sage.matrix.matrix_space.get_matrix_class(R, nrows, ncols, sparse, implementation)[source]¶
Return a matrix class according to the input.
Note
This returns the base class without the category.
INPUT:
R
– a base ringnrows
– number of rowsncols
– number of columnssparse
– boolean; whether the matrix class should be sparseimplementation
–None
or string or a matrix class; a possible implementation. See the documentation of the constructor ofMatrixSpace
.
EXAMPLES:
sage: from sage.matrix.matrix_space import get_matrix_class sage: get_matrix_class(ZZ, 4, 5, False, None) # needs sage.libs.linbox <class 'sage.matrix.matrix_integer_dense.Matrix_integer_dense'> sage: get_matrix_class(ZZ, 4, 5, True, None) # needs sage.libs.linbox <class 'sage.matrix.matrix_integer_sparse.Matrix_integer_sparse'> sage: get_matrix_class(ZZ, 3, 3, False, 'flint') # needs sage.libs.linbox <class 'sage.matrix.matrix_integer_dense.Matrix_integer_dense'> sage: get_matrix_class(ZZ, 3, 3, False, 'gap') # needs sage.libs.gap <class 'sage.matrix.matrix_gap.Matrix_gap'> sage: get_matrix_class(ZZ, 3, 3, False, 'generic') <class 'sage.matrix.matrix_generic_dense.Matrix_generic_dense'> sage: get_matrix_class(GF(2^15), 3, 3, False, None) # needs sage.rings.finite_rings <class 'sage.matrix.matrix_gf2e_dense.Matrix_gf2e_dense'> sage: get_matrix_class(GF(2^17), 3, 3, False, None) # needs sage.rings.finite_rings <class 'sage.matrix.matrix_generic_dense.Matrix_generic_dense'> sage: get_matrix_class(GF(2), 2, 2, False, 'm4ri') # needs sage.libs.m4ri <class 'sage.matrix.matrix_mod2_dense.Matrix_mod2_dense'> sage: get_matrix_class(GF(4), 2, 2, False, 'm4ri') # needs sage.libs.m4ri sage.rings.finite_rings <class 'sage.matrix.matrix_gf2e_dense.Matrix_gf2e_dense'> sage: get_matrix_class(GF(7), 2, 2, False, 'linbox-float') # needs sage.libs.linbox <class 'sage.matrix.matrix_modn_dense_float.Matrix_modn_dense_float'> sage: get_matrix_class(GF(7), 2, 2, False, 'linbox-double') # needs sage.libs.linbox <class 'sage.matrix.matrix_modn_dense_double.Matrix_modn_dense_double'> sage: get_matrix_class(RDF, 2, 2, False, 'numpy') # needs numpy <class 'sage.matrix.matrix_real_double_dense.Matrix_real_double_dense'> sage: get_matrix_class(CDF, 2, 3, False, 'numpy') # needs numpy sage.rings.complex_double <class 'sage.matrix.matrix_complex_double_dense.Matrix_complex_double_dense'> sage: get_matrix_class(GF(25,'x'), 4, 4, False, 'meataxe') # optional - meataxe, needs sage.rings.finite_rings <class 'sage.matrix.matrix_gfpn_dense.Matrix_gfpn_dense'> sage: get_matrix_class(IntegerModRing(3), 4, 4, False, 'meataxe') # optional - meataxe <class 'sage.matrix.matrix_gfpn_dense.Matrix_gfpn_dense'> sage: get_matrix_class(IntegerModRing(4), 4, 4, False, 'meataxe') Traceback (most recent call last): ... ValueError: 'meataxe' matrix can only deal with finite fields of order < 256 sage: get_matrix_class(GF(next_prime(255)), 4, 4, False, 'meataxe') # needs sage.rings.finite_rings Traceback (most recent call last): ... ValueError: 'meataxe' matrix can only deal with finite fields of order < 256 sage: get_matrix_class(ZZ, 3, 5, False, 'crazy_matrix') Traceback (most recent call last): ... ValueError: unknown matrix implementation 'crazy_matrix' over Integer Ring sage: get_matrix_class(GF(3), 2, 2, False, 'm4ri') Traceback (most recent call last): ... ValueError: 'm4ri' matrices are only available for fields of characteristic 2 and order <= 65536 sage: get_matrix_class(Zmod(2**30), 2, 2, False, 'linbox-float') # needs sage.libs.linbox Traceback (most recent call last): ... ValueError: 'linbox-float' matrices can only deal with order < 256 sage: get_matrix_class(Zmod(2**30), 2, 2, False, 'linbox-double') # needs sage.libs.linbox Traceback (most recent call last): ... ValueError: 'linbox-double' matrices can only deal with order < 94906266 sage: type(matrix(SR, 2, 2, 0)) # needs sage.symbolic <class 'sage.matrix.matrix_symbolic_dense.Matrix_symbolic_dense'> sage: type(matrix(SR, 2, 2, 0, sparse=True)) # needs sage.symbolic <class 'sage.matrix.matrix_symbolic_sparse.Matrix_symbolic_sparse'> sage: type(matrix(GF(7), 2, range(4))) # needs sage.libs.linbox <class 'sage.matrix.matrix_modn_dense_float.Matrix_modn_dense_float'> sage: type(matrix(GF(16007), 2, range(4))) # needs sage.libs.linbox <class 'sage.matrix.matrix_modn_dense_double.Matrix_modn_dense_double'> sage: type(matrix(CBF, 2, range(4))) # needs sage.libs.flint <class 'sage.matrix.matrix_complex_ball_dense.Matrix_complex_ball_dense'> sage: type(matrix(GF(2), 2, range(4))) # needs sage.libs.m4ri <class 'sage.matrix.matrix_mod2_dense.Matrix_mod2_dense'> sage: type(matrix(GF(64, 'z'), 2, range(4))) # needs sage.libs.m4ri sage.rings.finite_rings <class 'sage.matrix.matrix_gf2e_dense.Matrix_gf2e_dense'> sage: type(matrix(GF(125, 'z'), 2, range(4))) # optional - meataxe, needs sage.rings.finite_rings <class 'sage.matrix.matrix_gfpn_dense.Matrix_gfpn_dense'>
>>> from sage.all import * >>> from sage.matrix.matrix_space import get_matrix_class >>> get_matrix_class(ZZ, Integer(4), Integer(5), False, None) # needs sage.libs.linbox <class 'sage.matrix.matrix_integer_dense.Matrix_integer_dense'> >>> get_matrix_class(ZZ, Integer(4), Integer(5), True, None) # needs sage.libs.linbox <class 'sage.matrix.matrix_integer_sparse.Matrix_integer_sparse'> >>> get_matrix_class(ZZ, Integer(3), Integer(3), False, 'flint') # needs sage.libs.linbox <class 'sage.matrix.matrix_integer_dense.Matrix_integer_dense'> >>> get_matrix_class(ZZ, Integer(3), Integer(3), False, 'gap') # needs sage.libs.gap <class 'sage.matrix.matrix_gap.Matrix_gap'> >>> get_matrix_class(ZZ, Integer(3), Integer(3), False, 'generic') <class 'sage.matrix.matrix_generic_dense.Matrix_generic_dense'> >>> get_matrix_class(GF(Integer(2)**Integer(15)), Integer(3), Integer(3), False, None) # needs sage.rings.finite_rings <class 'sage.matrix.matrix_gf2e_dense.Matrix_gf2e_dense'> >>> get_matrix_class(GF(Integer(2)**Integer(17)), Integer(3), Integer(3), False, None) # needs sage.rings.finite_rings <class 'sage.matrix.matrix_generic_dense.Matrix_generic_dense'> >>> get_matrix_class(GF(Integer(2)), Integer(2), Integer(2), False, 'm4ri') # needs sage.libs.m4ri <class 'sage.matrix.matrix_mod2_dense.Matrix_mod2_dense'> >>> get_matrix_class(GF(Integer(4)), Integer(2), Integer(2), False, 'm4ri') # needs sage.libs.m4ri sage.rings.finite_rings <class 'sage.matrix.matrix_gf2e_dense.Matrix_gf2e_dense'> >>> get_matrix_class(GF(Integer(7)), Integer(2), Integer(2), False, 'linbox-float') # needs sage.libs.linbox <class 'sage.matrix.matrix_modn_dense_float.Matrix_modn_dense_float'> >>> get_matrix_class(GF(Integer(7)), Integer(2), Integer(2), False, 'linbox-double') # needs sage.libs.linbox <class 'sage.matrix.matrix_modn_dense_double.Matrix_modn_dense_double'> >>> get_matrix_class(RDF, Integer(2), Integer(2), False, 'numpy') # needs numpy <class 'sage.matrix.matrix_real_double_dense.Matrix_real_double_dense'> >>> get_matrix_class(CDF, Integer(2), Integer(3), False, 'numpy') # needs numpy sage.rings.complex_double <class 'sage.matrix.matrix_complex_double_dense.Matrix_complex_double_dense'> >>> get_matrix_class(GF(Integer(25),'x'), Integer(4), Integer(4), False, 'meataxe') # optional - meataxe, needs sage.rings.finite_rings <class 'sage.matrix.matrix_gfpn_dense.Matrix_gfpn_dense'> >>> get_matrix_class(IntegerModRing(Integer(3)), Integer(4), Integer(4), False, 'meataxe') # optional - meataxe <class 'sage.matrix.matrix_gfpn_dense.Matrix_gfpn_dense'> >>> get_matrix_class(IntegerModRing(Integer(4)), Integer(4), Integer(4), False, 'meataxe') Traceback (most recent call last): ... ValueError: 'meataxe' matrix can only deal with finite fields of order < 256 >>> get_matrix_class(GF(next_prime(Integer(255))), Integer(4), Integer(4), False, 'meataxe') # needs sage.rings.finite_rings Traceback (most recent call last): ... ValueError: 'meataxe' matrix can only deal with finite fields of order < 256 >>> get_matrix_class(ZZ, Integer(3), Integer(5), False, 'crazy_matrix') Traceback (most recent call last): ... ValueError: unknown matrix implementation 'crazy_matrix' over Integer Ring >>> get_matrix_class(GF(Integer(3)), Integer(2), Integer(2), False, 'm4ri') Traceback (most recent call last): ... ValueError: 'm4ri' matrices are only available for fields of characteristic 2 and order <= 65536 >>> get_matrix_class(Zmod(Integer(2)**Integer(30)), Integer(2), Integer(2), False, 'linbox-float') # needs sage.libs.linbox Traceback (most recent call last): ... ValueError: 'linbox-float' matrices can only deal with order < 256 >>> get_matrix_class(Zmod(Integer(2)**Integer(30)), Integer(2), Integer(2), False, 'linbox-double') # needs sage.libs.linbox Traceback (most recent call last): ... ValueError: 'linbox-double' matrices can only deal with order < 94906266 >>> type(matrix(SR, Integer(2), Integer(2), Integer(0))) # needs sage.symbolic <class 'sage.matrix.matrix_symbolic_dense.Matrix_symbolic_dense'> >>> type(matrix(SR, Integer(2), Integer(2), Integer(0), sparse=True)) # needs sage.symbolic <class 'sage.matrix.matrix_symbolic_sparse.Matrix_symbolic_sparse'> >>> type(matrix(GF(Integer(7)), Integer(2), range(Integer(4)))) # needs sage.libs.linbox <class 'sage.matrix.matrix_modn_dense_float.Matrix_modn_dense_float'> >>> type(matrix(GF(Integer(16007)), Integer(2), range(Integer(4)))) # needs sage.libs.linbox <class 'sage.matrix.matrix_modn_dense_double.Matrix_modn_dense_double'> >>> type(matrix(CBF, Integer(2), range(Integer(4)))) # needs sage.libs.flint <class 'sage.matrix.matrix_complex_ball_dense.Matrix_complex_ball_dense'> >>> type(matrix(GF(Integer(2)), Integer(2), range(Integer(4)))) # needs sage.libs.m4ri <class 'sage.matrix.matrix_mod2_dense.Matrix_mod2_dense'> >>> type(matrix(GF(Integer(64), 'z'), Integer(2), range(Integer(4)))) # needs sage.libs.m4ri sage.rings.finite_rings <class 'sage.matrix.matrix_gf2e_dense.Matrix_gf2e_dense'> >>> type(matrix(GF(Integer(125), 'z'), Integer(2), range(Integer(4)))) # optional - meataxe, needs sage.rings.finite_rings <class 'sage.matrix.matrix_gfpn_dense.Matrix_gfpn_dense'>
from sage.matrix.matrix_space import get_matrix_class get_matrix_class(ZZ, 4, 5, False, None) # needs sage.libs.linbox get_matrix_class(ZZ, 4, 5, True, None) # needs sage.libs.linbox get_matrix_class(ZZ, 3, 3, False, 'flint') # needs sage.libs.linbox get_matrix_class(ZZ, 3, 3, False, 'gap') # needs sage.libs.gap get_matrix_class(ZZ, 3, 3, False, 'generic') get_matrix_class(GF(2^15), 3, 3, False, None) # needs sage.rings.finite_rings get_matrix_class(GF(2^17), 3, 3, False, None) # needs sage.rings.finite_rings get_matrix_class(GF(2), 2, 2, False, 'm4ri') # needs sage.libs.m4ri get_matrix_class(GF(4), 2, 2, False, 'm4ri') # needs sage.libs.m4ri sage.rings.finite_rings get_matrix_class(GF(7), 2, 2, False, 'linbox-float') # needs sage.libs.linbox get_matrix_class(GF(7), 2, 2, False, 'linbox-double') # needs sage.libs.linbox get_matrix_class(RDF, 2, 2, False, 'numpy') # needs numpy get_matrix_class(CDF, 2, 3, False, 'numpy') # needs numpy sage.rings.complex_double get_matrix_class(GF(25,'x'), 4, 4, False, 'meataxe') # optional - meataxe, needs sage.rings.finite_rings get_matrix_class(IntegerModRing(3), 4, 4, False, 'meataxe') # optional - meataxe get_matrix_class(IntegerModRing(4), 4, 4, False, 'meataxe') get_matrix_class(GF(next_prime(255)), 4, 4, False, 'meataxe') # needs sage.rings.finite_rings get_matrix_class(ZZ, 3, 5, False, 'crazy_matrix') get_matrix_class(GF(3), 2, 2, False, 'm4ri') get_matrix_class(Zmod(2**30), 2, 2, False, 'linbox-float') # needs sage.libs.linbox get_matrix_class(Zmod(2**30), 2, 2, False, 'linbox-double') # needs sage.libs.linbox type(matrix(SR, 2, 2, 0)) # needs sage.symbolic type(matrix(SR, 2, 2, 0, sparse=True)) # needs sage.symbolic type(matrix(GF(7), 2, range(4))) # needs sage.libs.linbox type(matrix(GF(16007), 2, range(4))) # needs sage.libs.linbox type(matrix(CBF, 2, range(4))) # needs sage.libs.flint type(matrix(GF(2), 2, range(4))) # needs sage.libs.m4ri type(matrix(GF(64, 'z'), 2, range(4))) # needs sage.libs.m4ri sage.rings.finite_rings type(matrix(GF(125, 'z'), 2, range(4))) # optional - meataxe, needs sage.rings.finite_rings
- sage.matrix.matrix_space.is_MatrixSpace(x)[source]¶
Return whether
self
is an instance ofMatrixSpace
.EXAMPLES:
sage: from sage.matrix.matrix_space import is_MatrixSpace sage: MS = MatrixSpace(QQ,2) sage: A = MS.random_element() sage: is_MatrixSpace(MS) doctest:warning... DeprecationWarning: the function is_MatrixSpace is deprecated; use 'isinstance(..., MatrixSpace)' instead See https://github.com/sagemath/sage/issues/37924 for details. True sage: is_MatrixSpace(A) False sage: is_MatrixSpace(5) False
>>> from sage.all import * >>> from sage.matrix.matrix_space import is_MatrixSpace >>> MS = MatrixSpace(QQ,Integer(2)) >>> A = MS.random_element() >>> is_MatrixSpace(MS) doctest:warning... DeprecationWarning: the function is_MatrixSpace is deprecated; use 'isinstance(..., MatrixSpace)' instead See https://github.com/sagemath/sage/issues/37924 for details. True >>> is_MatrixSpace(A) False >>> is_MatrixSpace(Integer(5)) False
from sage.matrix.matrix_space import is_MatrixSpace MS = MatrixSpace(QQ,2) A = MS.random_element() is_MatrixSpace(MS) is_MatrixSpace(A) is_MatrixSpace(5)