Matrix33

#include <Imath/ImathMatrix.h>

The Matrix33 class template represents a 3x3 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
matrix33_example ()
{
    Imath::M33f M (Imath::UNINITIALIZED); // uninitialized

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

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

    Imath::M33f R;
    assert (R == Imath::identity33f);

    R.rotate (M_PI / 4);

    M = R * M;

    Imath::V3f v3 (1.0f, 0.0f, 0.0f);
    Imath::V3f r3 = v3 * M;

    assert (
        r3.equalWithAbsError (Imath::V3f (0.707107f, 0.7071070f, 0.0f), 1e-6f));
}
typedef Matrix33<float> Imath::M33f

3x3 matrix of float

typedef Matrix33<double> Imath::M33d

3x3 matrix of double

template<class T>
class Matrix33

3x3 transformation matrix

Direct access to elements

T x[3][3]

Matrix elements.

Constructors and Assignment

inline Matrix33(Uninitialized) noexcept

Uninitialized.

inline constexpr Matrix33() noexcept

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

inline constexpr Matrix33(T a) noexcept

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

inline constexpr Matrix33(const T a[3][3]) noexcept

Construct from 3x3 array a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] a[2][0] a[2][1] a[2][2].

inline constexpr Matrix33(T a, T b, T c, T d, T e, T f, T g, T h, T i) noexcept

Construct from given scalar values a b c d e f g h i.

inline constexpr Matrix33(const Matrix33 &v) noexcept

Copy constructor.

template<class S>
inline explicit constexpr Matrix33(const Matrix33<S> &v) noexcept

Construct from Matrix33 of another base type.

inline constexpr const Matrix33 &operator=(const Matrix33 &v) noexcept

Assignment operator.

inline constexpr const Matrix33 &operator=(T a) noexcept

Assignment from scalar.

~Matrix33() noexcept = default

Destructor.

Compatibility with Sb

inline T *getValue() noexcept

Return a raw pointer to the array of values.

inline const T *getValue() const noexcept

Return a raw pointer to the array of values.

template<class S>
inline void getValue(Matrix33<S> &v) const noexcept

Return the value in v

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

Set the value.

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

Set the value.

Arithmetic and Comparison

inline constexpr bool operator==(const Matrix33 &v) const noexcept

Equality.

inline constexpr bool operator!=(const Matrix33 &v) const noexcept

Inequality.

inline constexpr bool equalWithAbsError(const Matrix33<T> &v, T e) const noexcept

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

Returns:

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

inline constexpr bool equalWithRelError(const Matrix33<T> &v, T e) const noexcept

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

Returns:

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])

inline constexpr const Matrix33 &operator+=(const Matrix33 &v) noexcept

Component-wise addition.

inline constexpr const Matrix33 &operator+=(T a) noexcept

Component-wise addition.

inline constexpr Matrix33 operator+(const Matrix33 &v) const noexcept

Component-wise addition.

inline constexpr const Matrix33 &operator-=(const Matrix33 &v) noexcept

Component-wise subtraction.

inline constexpr const Matrix33 &operator-=(T a) noexcept

Component-wise subtraction.

inline constexpr Matrix33 operator-(const Matrix33 &v) const noexcept

Component-wise subtraction.

inline constexpr Matrix33 operator-() const noexcept

Component-wise multiplication by -1.

inline constexpr const Matrix33 &negate() noexcept

Component-wise multiplication by -1.

inline constexpr const Matrix33 &operator*=(T a) noexcept

Component-wise multiplication.

inline constexpr Matrix33 operator*(T a) const noexcept

Component-wise multiplication.

inline constexpr const Matrix33 &operator/=(T a) noexcept

Component-wise division.

inline constexpr Matrix33 operator/(T a) const noexcept

Component-wise division.

inline constexpr const Matrix33 &operator*=(const Matrix33 &v) noexcept

Matrix-matrix multiplication.

inline constexpr Matrix33 operator*(const Matrix33 &v) const noexcept

Matrix-matrix multiplication.

template<class S>
inline void multVecMatrix(const Vec2<S> &src, Vec2<S> &dst) const noexcept

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

Parameters:
  • src[in] The input vector

  • dst[out] The output vector

template<class S>
inline void multDirMatrix(const Vec2<S> &src, Vec2<S> &dst) const noexcept

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

Parameters:
  • src[in] The input vector

  • dst[out] The output vector

Maniplation

inline void makeIdentity() noexcept

Set to the identity matrix.

inline constexpr const Matrix33 &transpose() noexcept

Transpose.

inline constexpr Matrix33 transposed() const noexcept

Return the transpose.

inline constexpr const Matrix33 &invert(bool singExc)

Invert in place using the determinant.

Parameters:

singExc – If true, throw an exception if the matrix cannot be inverted.

Returns:

const reference to this

inline constexpr const Matrix33 &invert() noexcept

Invert in place using the determinant.

Returns:

const reference to this

inline constexpr Matrix33<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.

inline constexpr Matrix33<T> inverse() const noexcept

Return the inverse using the determinant, leaving this unmodified.

inline const Matrix33 &gjInvert(bool singExc)

Invert in place using the Gauss-Jordan method.

Significantly slower but more accurate than invert().

Parameters:

singExc – If true, throw an exception if the matrix cannot be inverted.

Returns:

const reference to this

inline const Matrix33 &gjInvert() noexcept

Invert in place using the Gauss-Jordan method.

Significantly slower but more accurate than invert().

Returns:

const reference to this

inline Matrix33<T> gjInverse(bool singExc) const

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

Significantly slower but more accurate than inverse().

inline Matrix33<T> gjInverse() const noexcept

Return the inverse using the Gauss-Jordan method.

Significantly slower, leaving this unmodified. Slower but more accurate than inverse().

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

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

inline constexpr T fastMinor(const int r0, const int r1, const int c0, const int c1) const noexcept

Build a minor using the specified rows and columns.

inline constexpr T determinant() const noexcept

Determinant.

inline constexpr T trace() const noexcept

Trace.

template<class S>
const Matrix33 &setRotation(S r) noexcept

Set matrix to rotation by r (in radians, assumed to be a scalar) around (0, 0, 1)

Returns:

const referenced to this

template<class S>
constexpr const Matrix33 &rotate(S r) noexcept
Returns:

const referenced to this

inline constexpr const Matrix33 &setScale(T s) noexcept

Set matrix to scale by given uniform factor.

Returns:

const referenced to this

template<class S>
constexpr const Matrix33 &setScale(const Vec2<S> &s) noexcept

Set matrix to scale by given vector.

Returns:

const referenced to this

template<class S>
constexpr const Matrix33 &scale(const Vec2<S> &s) noexcept

Scale the matrix by s.

Returns:

const referenced to this

template<class S>
constexpr const Matrix33 &setTranslation(const Vec2<S> &t) noexcept

Set matrix to translation by given vector.

Returns:

const referenced to this

inline constexpr Vec2<T> translation() const noexcept

Return the translation component.

template<class S>
constexpr const Matrix33 &translate(const Vec2<S> &t) noexcept

Translate the matrix by t.

Returns:

const referenced to this

template<class S>
constexpr const Matrix33 &setShear(const S &h) noexcept

Set matrix to shear x for each y coord.

by given factor xy

Returns:

const referenced to this

template<class S>
constexpr const Matrix33 &setShear(const Vec2<S> &h) noexcept

Set matrix to shear x for each y coord.

by given factor h.x and to shear y for each x coord. by given factor h.y

Returns:

const referenced to this

template<class S>
constexpr const Matrix33 &shear(const S &xy) noexcept

Shear the matrix in x for each y coord.

by given factor xy

Returns:

const referenced to this

template<class S>
constexpr const Matrix33 &shear(const Vec2<S> &h) noexcept

Shear the matrix in x for each y coord.

by given factor xy and shear y for each x coord. by given factor yx

Returns:

const referenced to this

Numeric Limits

static inline constexpr T baseTypeLowest() noexcept

Largest possible negative value.

static inline constexpr T baseTypeMax() noexcept

Largest possible positive value.

static inline constexpr T baseTypeSmallest() noexcept

Smallest possible positive value.

static inline constexpr T baseTypeEpsilon() noexcept

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 Vec3<T> BaseVecType

The base vector type.

Public Functions

inline T *operator[](int i) noexcept

Row access.

inline const T *operator[](int i) const noexcept

Row access.

template<class S>
inline constexpr Matrix33<T> &setValue(const Matrix33<S> &v) noexcept
template<class S>
inline constexpr Matrix33<T> &setTheMatrix(const Matrix33<S> &v) noexcept
template<class S>
inline const Matrix33<T> &setRotation(S r) noexcept
template<class S>
inline constexpr const Matrix33<T> &rotate(S r) noexcept
template<class S>
inline constexpr const Matrix33<T> &setScale(const Vec2<S> &s) noexcept
template<class S>
inline constexpr const Matrix33<T> &scale(const Vec2<S> &s) noexcept
template<class S>
inline constexpr const Matrix33<T> &setTranslation(const Vec2<S> &t) noexcept
template<class S>
inline constexpr const Matrix33<T> &translate(const Vec2<S> &t) noexcept
template<class S>
inline constexpr const Matrix33<T> &setShear(const S &xy) noexcept
template<class S>
inline constexpr const Matrix33<T> &setShear(const Vec2<S> &h) noexcept
template<class S>
inline constexpr const Matrix33<T> &shear(const S &xy) noexcept
template<class S>
inline constexpr const Matrix33<T> &shear(const Vec2<S> &h) noexcept

Public Static Functions

static inline constexpr unsigned int dimensions() noexcept

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

template<class T>
std::ostream &Imath::operator<<(std::ostream &s, const Matrix33<T> &m)

Stream output, as: (m00 m01 m02 m10 m11 m12 m20 m21 m22)