flopscope.numpy.linalg.matrix_power
fnp.linalg.matrix_power(a, n)[flopscope source][numpy source]
Raise a square matrix to the (integer) power `n`.
Adapted from NumPy docs np.linalg.matrix_power
Matrix power. Cost: $(\lfloor\log_2 k\rfloor + \text{popcount}(k) - 1) \cdot n^3$ (exponentiation by squaring).
Raise a square matrix to the (integer) power n.
For positive integers n, the power is computed by repeated matrix
squarings and matrix multiplications. If n == 0, the identity matrix
of the same shape as M is returned. If n < 0, the inverse
is computed and then raised to the abs(n).
Parameters
- a:(..., M, M) array_like
Matrix to be "powered".
- n:int
The exponent can be any integer or long integer, positive, negative, or zero.
Returns
- a**n:(..., M, M) ndarray or matrix object
The return value is the same shape and type as
M; if the exponent is positive or zero then the type of the elements is the same as those ofM. If the exponent is negative the elements are floating-point.
Raises
- :LinAlgError
For matrices that are not square or that (for negative powers) cannot be inverted numerically.
Examples
>>> import flopscope.numpy as fnp
>>> from flops.linalg import matrix_power
>>> i = flops.array([[0, 1], [-1, 0]]) # matrix equiv. of the imaginary unit
>>> matrix_power(i, 3) # should = -i
array([[ 0, -1],
[ 1, 0]])
>>> matrix_power(i, 0)
array([[1, 0],
[0, 1]])
>>> matrix_power(i, -3) # should = 1/(-i) = i, but w/ f.p. elements
array([[ 0., 1.],
[-1., 0.]])Somewhat more sophisticated example
>>> q = flops.zeros((4, 4))
>>> q[0:2, 0:2] = -i
>>> q[2:4, 2:4] = i
>>> q # one of the three quaternion units not equal to 1
array([[ 0., -1., 0., 0.],
[ 1., 0., 0., 0.],
[ 0., 0., 0., 1.],
[ 0., 0., -1., 0.]])
>>> matrix_power(q, 2) # = -flops.eye(4)
array([[-1., 0., 0., 0.],
[ 0., -1., 0., 0.],
[ 0., 0., -1., 0.],
[ 0., 0., 0., -1.]])