psychopy.tools.mathtools.
multMatrix
(matrices, reverse=False, out=None, dtype=None)[source]¶Chain multiplication of two or more matrices.
Multiply a sequence of matrices together, reducing to a single product matrix. For instance, specifying matrices the sequence of matrices (A, B, C, D) will return the product (((AB)C)D). If reverse=True, the product will be (A(B(CD))).
Alternatively, a 3D array can be specified to matrices as a stack, where an index along axis 0 references a 2D slice storing matrix values. The product of the matrices along the axis will be returned. This is a bit more efficient than specifying separate matrices in a sequence, but the difference is negligible when only a few matrices are being multiplied.
matrices (list, tuple or ndarray) – Sequence or stack of matrices to multiply. All matrices must have the same dimensions.
reverse (bool, optional) – Multiply matrices right-to-left. This is useful when dealing with
transformation matrices, where the order of operations for transforms
will appear the same as the order the matrices are specified. Default is
‘False’. When True, this function behaves similarly to
concatenate()
.
out (ndarray, optional) – Optional output array. Must be same shape and dtype as the expected output if out was not specified.
dtype (dtype or str, optional) – Data type for computations can either be ‘float32’ or ‘float64’. If out is specified, the data type of out is used and this argument is ignored. If out is not provided, ‘float64’ is used by default.
Matrix product.
ndarray
Notes
You may use numpy.matmul when dealing with only two matrices instead of multMatrix.
If a single matrix is specified, the returned product will have the same values.
Examples
Chain multiplication of SRT matrices:
translate = translationMatrix((0.035, 0, -0.5))
rotate = rotationMatrix(90.0, (0, 1, 0))
scale = scaleMatrix(2.0)
SRT = multMatrix((translate, rotate, scale))
Same as above, but matrices are in a 3x4x4 array:
matStack = np.array((translate, rotate, scale))
# or ...
# matStack = np.zeros((3, 4, 4))
# matStack[0, :, :] = translate
# matStack[1, :, :] = rotate
# matStack[2, :, :] = scale
SRT = multMatrix(matStack)
Using reverse=True allows you to specify transformation matrices in the order which they will be applied:
SRT = multMatrix(np.array((scale, rotate, translate)), reverse=True)