Spaces:
Sleeping
Sleeping
from .utilities import _iszero | |
def _columnspace(M, simplify=False): | |
"""Returns a list of vectors (Matrix objects) that span columnspace of ``M`` | |
Examples | |
======== | |
>>> from sympy import Matrix | |
>>> M = Matrix(3, 3, [1, 3, 0, -2, -6, 0, 3, 9, 6]) | |
>>> M | |
Matrix([ | |
[ 1, 3, 0], | |
[-2, -6, 0], | |
[ 3, 9, 6]]) | |
>>> M.columnspace() | |
[Matrix([ | |
[ 1], | |
[-2], | |
[ 3]]), Matrix([ | |
[0], | |
[0], | |
[6]])] | |
See Also | |
======== | |
nullspace | |
rowspace | |
""" | |
reduced, pivots = M.echelon_form(simplify=simplify, with_pivots=True) | |
return [M.col(i) for i in pivots] | |
def _nullspace(M, simplify=False, iszerofunc=_iszero): | |
"""Returns list of vectors (Matrix objects) that span nullspace of ``M`` | |
Examples | |
======== | |
>>> from sympy import Matrix | |
>>> M = Matrix(3, 3, [1, 3, 0, -2, -6, 0, 3, 9, 6]) | |
>>> M | |
Matrix([ | |
[ 1, 3, 0], | |
[-2, -6, 0], | |
[ 3, 9, 6]]) | |
>>> M.nullspace() | |
[Matrix([ | |
[-3], | |
[ 1], | |
[ 0]])] | |
See Also | |
======== | |
columnspace | |
rowspace | |
""" | |
reduced, pivots = M.rref(iszerofunc=iszerofunc, simplify=simplify) | |
free_vars = [i for i in range(M.cols) if i not in pivots] | |
basis = [] | |
for free_var in free_vars: | |
# for each free variable, we will set it to 1 and all others | |
# to 0. Then, we will use back substitution to solve the system | |
vec = [M.zero] * M.cols | |
vec[free_var] = M.one | |
for piv_row, piv_col in enumerate(pivots): | |
vec[piv_col] -= reduced[piv_row, free_var] | |
basis.append(vec) | |
return [M._new(M.cols, 1, b) for b in basis] | |
def _rowspace(M, simplify=False): | |
"""Returns a list of vectors that span the row space of ``M``. | |
Examples | |
======== | |
>>> from sympy import Matrix | |
>>> M = Matrix(3, 3, [1, 3, 0, -2, -6, 0, 3, 9, 6]) | |
>>> M | |
Matrix([ | |
[ 1, 3, 0], | |
[-2, -6, 0], | |
[ 3, 9, 6]]) | |
>>> M.rowspace() | |
[Matrix([[1, 3, 0]]), Matrix([[0, 0, 6]])] | |
""" | |
reduced, pivots = M.echelon_form(simplify=simplify, with_pivots=True) | |
return [reduced.row(i) for i in range(len(pivots))] | |
def _orthogonalize(cls, *vecs, normalize=False, rankcheck=False): | |
"""Apply the Gram-Schmidt orthogonalization procedure | |
to vectors supplied in ``vecs``. | |
Parameters | |
========== | |
vecs | |
vectors to be made orthogonal | |
normalize : bool | |
If ``True``, return an orthonormal basis. | |
rankcheck : bool | |
If ``True``, the computation does not stop when encountering | |
linearly dependent vectors. | |
If ``False``, it will raise ``ValueError`` when any zero | |
or linearly dependent vectors are found. | |
Returns | |
======= | |
list | |
List of orthogonal (or orthonormal) basis vectors. | |
Examples | |
======== | |
>>> from sympy import I, Matrix | |
>>> v = [Matrix([1, I]), Matrix([1, -I])] | |
>>> Matrix.orthogonalize(*v) | |
[Matrix([ | |
[1], | |
[I]]), Matrix([ | |
[ 1], | |
[-I]])] | |
See Also | |
======== | |
MatrixBase.QRdecomposition | |
References | |
========== | |
.. [1] https://en.wikipedia.org/wiki/Gram%E2%80%93Schmidt_process | |
""" | |
from .decompositions import _QRdecomposition_optional | |
if not vecs: | |
return [] | |
all_row_vecs = (vecs[0].rows == 1) | |
vecs = [x.vec() for x in vecs] | |
M = cls.hstack(*vecs) | |
Q, R = _QRdecomposition_optional(M, normalize=normalize) | |
if rankcheck and Q.cols < len(vecs): | |
raise ValueError("GramSchmidt: vector set not linearly independent") | |
ret = [] | |
for i in range(Q.cols): | |
if all_row_vecs: | |
col = cls(Q[:, i].T) | |
else: | |
col = cls(Q[:, i]) | |
ret.append(col) | |
return ret | |