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]
```

Copyright Sage, 2010. Some rights reserved under creative commons license. Content on this site is licensed under a Creative Commons Attribution Share Alike 3.0 license.