1 | initial version |
If principal submatrix of order k means intersection of the first k rows and first k columns, here is an example.
sage: m = matrix(ZZ, 4, range(4^2))
sage: m
[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]
sage: p = [m[0:k, 0:k] for k in range(m.ncols() + 1)]
sage: for a in p:
....: print a
....: print ''
....:
[]
[0]
[0 1]
[4 5]
[ 0 1 2]
[ 4 5 6]
[ 8 9 10]
[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]
2 | No.2 Revision |
If principal submatrix of order k means intersection of the first k rows and first k columns, here is an example.
sage: m = matrix(ZZ, 4, range(4^2))
sage: m
[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]
sage: p = [m[0:k, 0:k] for k in range(m.ncols() + 1)]
sage: for a in p:
....: print a
....: print ''
....:
[]
[0]
[0 1]
[4 5]
[ 0 1 2]
[ 4 5 6]
[ 8 9 10]
[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]
You could define a function:
sage: def principal_submatrix(m, k):
....: """
....: Return the principal submatrix of m of order k
....: """
....: return m[0:k, 0:k]
which you could use as follows:
sage: m = matrix(ZZ, 4, range(4^2))
sage: m
[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]
sage: principal_submatrix(m, 3)
[ 0 1 2]
[ 4 5 6]
[ 8 9 10]
sage: principal_submatrix(m, 2)
[0 1]
[4 5]
3 | No.3 Revision |
If The submatrix section of Wikipedia's matrix
page
mentions several possible definitions of principal submatrix of order k means intersection of the first k
.
Given your question, you likely adopt the definition by which a principal
submatrix of order k
is a k
by k
submatrix in which the set of row indices
that remain is the same as the set of column indices that remain.
So let us define principal_submatrix
as a function that takes a matrix
and a set of indices to keep.
def principal_submatrix(m, s, sort=False):
"""
Return the submatrix of m corresponding to indices in s
INPUT:
- ``m`` -- a matrix
- ``s`` -- an iterable for the indices of rows and columns to keep
OUTPUT:
The submatrix of ``m`` using the indices in ``s``.
An optional argument specifies whether to sort the indices.
Note that duplicate indices will be kept.
"""
if sort:
s = sorted(s)
return m[s, s]
From there define principal_submatrices
as a function that takes
a matrix and the number of indices to keep.
def principal_submatrices(m, k):
"""
Return the list of principal submatrices of m of order k
These are the submatrices of m (assumed to be a square matrix)
obtained by keeping k rows and first k columns,
here is an example.columns, with the same indices.
"""
S = Subsets(range(m.ncols()), k)
return [principal_submatrix(m, s, sort=True) for s in S]
To illustrate these functions, let us use the following 4 by 4 matrix.
sage: m = matrix(ZZ, 4, range(4^2))
sage: m
[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]
sage: p = [m[0:k, 0:k] for k in range(m.ncols() + 1)]
sage: for a in p:
....: print a
....: print ''
....:
[]
[0]
Extract a specified principal submatrix:
sage: principal_submatrix(m, [0, 1, 3])
[ 0 1 3]
[ 4 5 7]
[12 13 15]
List all principal submatrices of each order:
sage: principal_submatrices(m, 0)
[[]]
sage: principal_submatrices(m, 1)
[[0], [5], [10], [15]]
sage: principal_submatrices(m, 2)
[
[0 1]
1] [ 0 2] [ 0 3] [ 5 6] [ 5 7] [10 11]
[4 5]
5], [ 8 10], [12 15], [ 9 10], [13 15], [14 15]
]
sage: principal_submatrices(m, 3)
[
[ 0 1 2]
2] [ 0 1 3] [ 0 2 3] [ 5 6 7]
[ 4 5 6]
6] [ 4 5 7] [ 8 10 11] [ 9 10]
10 11]
[ 8 9 10], [12 13 15], [12 14 15], [13 14 15]
]
sage: principal_submatrices(m, 4)
[
[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]
]
You could define a function:
sage: def principal_submatrix(m, k):
....: """
....: Return the principal submatrix of m of order k
....: """
....: return m[0:k, 0:k]
which you could use as follows:
sage: m = matrix(ZZ, 4, range(4^2))
sage: m
[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]
sage: principal_submatrix(m, 3)
[ 0 1 2]
[ 4 5 6]
[ 8 9 10]
sage: principal_submatrix(m, 2)
[0 1]
[4 5]