Matrix44

The Matrix44 class template represents a 4x4 matrix, with predefined typedefs for float and double.

There are also various utility functions that operate on matrices defined in ImathMatrixAlgo.h and described in Matrix Functions.

Individual components of a matrix M may be referenced as either M[j][i] or M.x[j][i]. While the latter is a little awkward, it has an advantage when used in loops that may be auto-vectorized or explicitly vectorized by #pragma omp simd or other such hints, because the function call and pointer casting of operator[] can confuse the compiler just enough to prevent vectorization of the loop, whereas directly addressing the real underlying array (M.x[j][i]) does not.

Example:

#include <Imath/ImathMatrix.h>
#include <Imath/ImathMatrixAlgo.h>
#include <cassert>

void
matrix44_example()
{
    Imath::M44f M (Imath::UNINITIALIZED); // uninitialized

    M.makeIdentity();
    assert (M[0][0] == 1.0f);
    assert (M[0][1] == 0.0f);

    Imath::M44f Minv = M.inverse();

    Imath::M44f R;
    assert (R == Imath::identity44f);

    R.rotate (Imath::V3f (0.02f, M_PI/4, 0.0f));
    
    M = R * M;

    Imath::V3f v3 (1.0f, 0.0f, 0.0f);
    Imath::V4f v4 (1.0f, 0.0f, 0.0f, 1.0f);

    Imath::V3f r3 = v3 * M;
    assert (r3.equalWithAbsError (Imath::V3f (0.707107f, 0.0f, -0.7071070f), 1e-6f));

    Imath::V4f r4 = v4 * M;
    assert (r4.equalWithAbsError (Imath::V4f (0.707107f, 0.0f, -0.7071070f, 1.0f), 1e-6f));
}
typedef Matrix44<float> Imath::M44f

4x4 matrix of float

typedef Matrix44<double> Imath::M44d

4x4 matrix of double

template<class T>
class Matrix44

4x4 transformation matrix

Direct access to elements

template<>
T x[4][4]

Matrix elements.

Constructors and Assignment

constexpr Matrix44(Uninitialized)

Uninitialized.

constexpr Matrix44()

Default constructor: initialize to identity 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1.

constexpr Matrix44(T a)

Initialize to scalar constant a a a a a a a a a a a a a a a a.

constexpr Matrix44(const T a[4][4])

Construct from 4x4 array a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3] a[3][0] a[3][1] a[3][2] a[3][3].

constexpr Matrix44(T a, T b, T c, T d, T e, T f, T g, T h, T i, T j, T k, T l, T m, T n, T o, T p)

Construct from given scalar values a b c d e f g h i j k l m n o p.

constexpr Matrix44(Matrix33<T> r, Vec3<T> t)

Construct from a 3x3 rotation matrix and a translation vector r r r 0 r r r 0 r r r 0 t t t 1.

constexpr Matrix44(const Matrix44 &v)

Copy constructor.

template<class S>
constexpr Matrix44(const Matrix44<S> &v)

Construct from Matrix44 of another base type.

constexpr const Matrix44<T> &operator=(const Matrix44 &v)

Assignment operator.

constexpr const Matrix44<T> &operator=(T a)

Assignment from scalar.

~Matrix44()

Destructor.

Compatibility with Sb

T *getValue()

Return a raw pointer to the array of values.

const T *getValue() const

Return a raw pointer to the array of values.

template<class S>
void getValue(Matrix44<S> &v) const

Return the value in v

template<class S>
constexpr Matrix44 &setValue(const Matrix44<S> &v)

Set the value.

template<class S>
constexpr Matrix44 &setTheMatrix(const Matrix44<S> &v)

Set the value.

Arithmetic and Comparison

constexpr bool operator==(const Matrix44 &v) const

Equality.

constexpr bool operator!=(const Matrix44 &v) const

Inequality.

constexpr bool equalWithAbsError(const Matrix44<T> &v, T e) const

Compare two matrices and test if they are “approximately equal”:

Return
True if the coefficients of this and m are the same with an absolute error of no more than e, i.e., for all i, j:
abs (this[i][j] - m[i][j]) <= e

constexpr bool equalWithRelError(const Matrix44<T> &v, T e) const

Compare two matrices and test if they are “approximately equal”:

Return
True if the coefficients of this and m are the same with a relative error of no more than e, i.e., for all i, j:
abs (this[i] - v[i][j]) <= e * abs (this[i][j])

constexpr const Matrix44<T> &operator+=(const Matrix44 &v)

Component-wise addition.

constexpr const Matrix44<T> &operator+=(T a)

Component-wise addition.

constexpr Matrix44<T> operator+(const Matrix44 &v) const

Component-wise addition.

constexpr const Matrix44<T> &operator-=(const Matrix44 &v)

Component-wise subtraction.

constexpr const Matrix44<T> &operator-=(T a)

Component-wise subtraction.

constexpr Matrix44<T> operator-(const Matrix44 &v) const

Component-wise subtraction.

constexpr Matrix44<T> operator-() const

Component-wise multiplication by -1.

constexpr const Matrix44<T> &negate()

Component-wise multiplication by -1.

constexpr const Matrix44<T> &operator*=(T a)

Component-wise multiplication.

constexpr Matrix44<T> operator*(T a) const

Component-wise multiplication.

constexpr const Matrix44<T> &operator/=(T a)

Component-wise division.

constexpr Matrix44<T> operator/(T a) const

Component-wise division.

constexpr const Matrix44<T> &operator*=(const Matrix44 &v)

Matrix-matrix multiplication.

constexpr Matrix44<T> operator*(const Matrix44 &v) const

Matrix-matrix multiplication.

template<class S>
void multVecMatrix(const Vec3<S> &src, Vec3<S> &dst) const

Vector-matrix multiplication: a homogeneous transformation by computing Vec3 (src.x, src.y, src.z, 1) * m and dividing by the result’s third element.

Parameters
  • src: The input vector
  • dst: The output vector

template<class S>
void multDirMatrix(const Vec3<S> &src, Vec3<S> &dst) const

Vector-matrix multiplication: multiply src by the upper left 2x2 submatrix, ignoring the rest of matrix.

Parameters
  • src: The input vector
  • dst: The output vector

void multiply(const Matrix44 &a, const Matrix44 &b, Matrix44 &c)

Matrix-matrix multiplication: compute c = a * b.

constexpr Matrix44<T> multiply(const Matrix44 &a, const Matrix44 &b)

Matrix-matrix multiplication returning a result.

Maniplation

void makeIdentity()

Set to the identity matrix.

constexpr const Matrix44<T> &transpose()

Transpose.

constexpr Matrix44<T> transposed() const

Return the transpose.

constexpr const Matrix44<T> &invert(bool singExc)

Invert in place using the determinant.

Return
const reference to this
Parameters
  • singExc: If true, throw an exception if the matrix cannot be inverted.

constexpr const Matrix44<T> &invert()

Invert in place using the determinant.

Return
const reference to this

constexpr Matrix44<T> inverse(bool singExc) const

Return the inverse using the determinant, leaving this unmodified.

Parameters
  • singExc: If true, throw an exception if the matrix cannot be inverted.

constexpr Matrix44<T> inverse() const

Return the inverse using the determinant, leaving this unmodified.

constexpr const Matrix44<T> &gjInvert(bool singExc)

Invert in place using the Gauss-Jordan method.

Significantly slower but more accurate than invert().

Return
const reference to this
Parameters
  • singExc: If true, throw an exception if the matrix cannot be inverted.

constexpr const Matrix44<T> &gjInvert()

Invert in place using the Gauss-Jordan method.

Significantly slower but more accurate than invert().

Return
const reference to this

Matrix44<T> gjInverse(bool singExc) const

Return the inverse using the Gauss-Jordan method, leaving this unmodified.

Significantly slower but more accurate than inverse().

Matrix44<T> gjInverse() const

Return the inverse using the Gauss-Jordan method, leaving this unmodified Significantly slower but more accurate than inverse().

constexpr T minorOf(const int r, const int c) const

Calculate the matrix minor of the (r,c) element.

constexpr T fastMinor(const int r0, const int r1, const int r2, const int c0, const int c1, const int c2) const

Build a minor using the specified rows and columns.

constexpr T determinant() const

Determinant.

constexpr T trace() const

Trace.

template<class S>
const Matrix44 &setEulerAngles(const Vec3<S> &r)

Set matrix to rotation by XYZ euler angles (in radians)

Return
const referenced to this

template<class S>
constexpr const Matrix44 &setAxisAngle(const Vec3<S> &ax, S ang)

Set matrix to rotation around given axis by given angle (in radians)

Return
const referenced to this

template<class S>
const Matrix44 &rotate(const Vec3<S> &r)

Rotate the matrix by XYZ euler angles in r (in radians)

Return
const referenced to this

constexpr const Matrix44<T> &setScale(T s)

Set matrix to scale by given uniform factor.

Return
const referenced to this

template<class S>
constexpr const Matrix44 &setScale(const Vec3<S> &s)

Set matrix to scale by given vector.

Return
const referenced to this

template<class S>
constexpr const Matrix44 &scale(const Vec3<S> &s)

Scale the matrix by s.

Return
const referenced to this

template<class S>
constexpr const Matrix44 &setTranslation(const Vec3<S> &t)

Set matrix to translation by given vector.

Return
const referenced to this

constexpr const Vec3<T> translation() const

Return translation component.

template<class S>
constexpr const Matrix44 &translate(const Vec3<S> &t)

Translate the matrix by t.

Return
const referenced to this

template<class S>
constexpr const Matrix44 &setShear(const Vec3<S> &h)

Set matrix to shear by given vector h.

The resulting matrix

  • will shear x for each y coord. by a factor of h[0] ;
  • will shear x for each z coord. by a factor of h[1] ;
  • will shear y for each z coord. by a factor of h[2] .
    Return
    const referenced to this

template<class S>
constexpr const Matrix44 &setShear(const Shear6<S> &h)

Set matrix to shear by given factors.

The resulting matrix

  • will shear x for each y coord. by a factor of h.xy ;
  • will shear x for each z coord. by a factor of h.xz ;
  • will shear y for each z coord. by a factor of h.yz ;
  • will shear y for each x coord. by a factor of h.yx ;
  • will shear z for each x coord. by a factor of h.zx ;
  • will shear z for each y coord. by a factor of h.zy .
    Return
    const referenced to this

template<class S>
constexpr const Matrix44 &shear(const Vec3<S> &h)

Shear the matrix by given vector.

The composed matrix will be shear * this, where the shear matrix …

  • will shear x for each y coord. by a factor of h[0] ;
  • will shear x for each z coord. by a factor of h[1] ;
  • will shear y for each z coord. by a factor of h[2] .
    Return
    const referenced to this

template<class S>
constexpr const Matrix44 &shear(const Shear6<S> &h)

Shear the matrix by the given factors.

The composed matrix will be shear * this, where the shear matrix …

  • will shear x for each y coord. by a factor of h.xy ;
  • will shear x for each z coord. by a factor of h.xz ;
  • will shear y for each z coord. by a factor of h.yz ;
  • will shear y for each x coord. by a factor of h.yx ;
  • will shear z for each x coord. by a factor of h.zx ;
  • will shear z for each y coord. by a factor of h.zy .
    Return
    const referenced to this

Numeric Limits

static constexpr T baseTypeLowest()

Largest possible negative value.

static constexpr T baseTypeMax()

Largest possible positive value.

static constexpr T baseTypeSmallest()

Smallest possible positive value.

static constexpr T baseTypeEpsilon()

Smallest possible e for which 1+e != 1.

Public Types

typedef T BaseType

The base type: In templates that accept a parameter V (could be a Color4), you can refer to T as V::BaseType

typedef Vec4<T> BaseVecType

The base vector type.

Public Functions

T *operator[](int i)

Row access.

const T *operator[](int i) const

Row access.

template<class S>
constexpr Matrix44<T> &setValue(const Matrix44<S> &v)
template<class S>
constexpr Matrix44<T> &setTheMatrix(const Matrix44<S> &v)
template<class S>
const Matrix44<T> &setEulerAngles(const Vec3<S> &r)
template<class S>
constexpr const Matrix44<T> &setAxisAngle(const Vec3<S> &axis, S angle)
template<class S>
const Matrix44<T> &rotate(const Vec3<S> &r)
template<class S>
constexpr const Matrix44<T> &setScale(const Vec3<S> &s)
template<class S>
constexpr const Matrix44<T> &scale(const Vec3<S> &s)
template<class S>
constexpr const Matrix44<T> &setTranslation(const Vec3<S> &t)
template<class S>
constexpr const Matrix44<T> &translate(const Vec3<S> &t)
template<class S>
constexpr const Matrix44<T> &setShear(const Vec3<S> &h)
template<class S>
constexpr const Matrix44<T> &setShear(const Shear6<S> &h)
template<class S>
constexpr const Matrix44<T> &shear(const Vec3<S> &h)
template<class S>
constexpr const Matrix44<T> &shear(const Shear6<S> &h)

Public Static Functions

static constexpr unsigned int dimensions()

Return the number of the row and column dimensions, i.e. 4.

Warning

doxygenfunction: Unable to resolve multiple matches for function “operator<<” with arguments (std::ostream& s, const Matrix44<T>& m) in doxygen xml output for project “Imath” from directory: /build/ilmbase-TFRjEc/ilmbase-3.1.11/obj-x86_64-linux-gnu/website/doxygen/xml. Potential matches:

- std::ostream &operator<<(std::ostream&, Imath::half)
- template<class T>
  std::ostream &Imath::operator<<(std::ostream&, const Color4<T>&)
- template<class T>
  std::ostream &Imath::operator<<(std::ostream&, const Euler<T>&)
- template<class T>
  std::ostream &Imath::operator<<(std::ostream&, const Interval<T>&)
- template<class T>
  std::ostream &Imath::operator<<(std::ostream&, const Line3<T>&)
- template<class T>
  std::ostream &Imath::operator<<(std::ostream&, const Matrix22<T>&)
- template<class T>
  std::ostream &Imath::operator<<(std::ostream&, const Matrix33<T>&)
- template<class T>
  std::ostream &Imath::operator<<(std::ostream&, const Matrix44<T>&)
- template<class T>
  std::ostream &Imath::operator<<(std::ostream&, const Plane3<T>&)
- template<class T>
  std::ostream &Imath::operator<<(std::ostream&, const Quat<T>&)
- template<class T>
  std::ostream &Imath::operator<<(std::ostream&, const Shear6<T>&)
- template<class T>
  std::ostream &Imath::operator<<(std::ostream&, const Vec2<T>&)
- template<class T>
  std::ostream &Imath::operator<<(std::ostream&, const Vec3<T>&)
- template<class T>
  std::ostream &Imath::operator<<(std::ostream&, const Vec4<T>&)