123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- 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
|