Immutable Matrices
==================

.. currentmodule:: sympy

The standard :obj:`~.Matrix` class in SymPy is mutable. This is important for
performance reasons but means that standard matrices cannot interact well with
the rest of SymPy. This is because the :class:`~.Basic` object, from which most
SymPy classes inherit, is immutable.

The mission of the :class:`~.ImmutableDenseMatrix` class, which is aliased as
:obj:`~.ImmutableMatrix` for short, is to bridge the tension
between performance/mutability and safety/immutability. Immutable matrices can
do almost everything that normal matrices can do but they inherit from
:class:`~.Basic` and can thus interact more naturally with the rest of SymPy.
:obj:`~.ImmutableMatrix` also inherits from :class:`~.MatrixExpr`, allowing it to
interact freely with SymPy's Matrix Expression module.

You can turn any Matrix-like object into an :obj:`~.ImmutableMatrix` by calling
the constructor

    >>> from sympy import Matrix, ImmutableMatrix
    >>> M = Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
    >>> M[1, 1] = 0
    >>> IM = ImmutableMatrix(M)
    >>> IM
    Matrix([
    [1, 2, 3],
    [4, 0, 6],
    [7, 8, 9]])
    >>> IM[1, 1] = 5
    Traceback (most recent call last):
    ...
    TypeError: Can not set values in Immutable Matrix. Use Matrix instead.


ImmutableMatrix Class Reference
-------------------------------

.. module:: sympy.matrices.immutable

.. autoclass:: ImmutableMatrix
   :members:

.. autoclass:: ImmutableDenseMatrix
   :members:
