/usr/include/libwildmagic/Wm5GMatrix.h is in libwildmagic-dev 5.13-1ubuntu3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 | // Geometric Tools, LLC
// Copyright (c) 1998-2014
// Distributed under the Boost Software License, Version 1.0.
// http://www.boost.org/LICENSE_1_0.txt
// http://www.geometrictools.com/License/Boost/LICENSE_1_0.txt
//
// File Version: 5.0.2 (2011/07/09)
#ifndef WM5GMATRIX_H
#define WM5GMATRIX_H
// Matrix operations are applied on the left. For example, given a matrix M
// and a vector V, matrix-times-vector is M*V. That is, V is treated as a
// column vector. Some graphics APIs use V*M where V is treated as a row
// vector. In this context the "M" matrix is really a transpose of the M as
// represented in Wild Magic. Similarly, to apply two matrix operations M0
// and M1, in that order, you compute M1*M0 so that the transform of a vector
// is (M1*M0)*V = M1*(M0*V). Some graphics APIs use M0*M1, but again these
// matrices are the transpose of those as represented in Wild Magic. You
// must therefore be careful about how you interface the transformation code
// with graphics APIS.
//
// Matrices are stored in row-major order, matrix[row][col].
#include "Wm5MathematicsLIB.h"
#include "Wm5GVector.h"
namespace Wm5
{
template <typename Real>
class GMatrix
{
public:
// Construction and destruction.
GMatrix (int numRows = 0, int numColumns = 0);
GMatrix (int numRows, int numColumns, const Real* entry);
GMatrix (int numRows, int numColumns, const Real** matrix);
GMatrix (const GMatrix& mat);
~GMatrix ();
// Member access.
void SetSize (int numRows, int numColumns);
inline void GetSize (int& numRows, int& numColumns) const;
inline int GetNumRows () const;
inline int GetNumColumns () const;
inline int GetNumElements () const;
inline const Real* GetElements () const;
inline Real* GetElements ();
inline const Real* operator[] (int row) const;
inline Real* operator[] (int row);
inline const Real& operator() (int row, int col) const;
inline Real& operator() (int row, int col);
void SetRow (int row, const GVector<Real>& vec);
GVector<Real> GetRow (int row) const;
void SetColumn (int col, const GVector<Real>& vec);
GVector<Real> GetColumn (int col) const;
void SetMatrix (int numRows, int numColumns, const Real* entry);
void SetMatrix (int numRows, int numColumns, const Real** matrix);
// Support for swapping rows and columns.
void SwapRows (int row0, int row1);
void SwapColumns (int col0, int col1);
// Assignment.
GMatrix& operator= (const GMatrix& mat);
// Comparison (for use by STL containers). The matrices must be the
// same size (equal number of rows and equal number of columns).
bool operator== (const GMatrix& mat) const;
bool operator!= (const GMatrix& mat) const;
bool operator< (const GMatrix& mat) const;
bool operator<= (const GMatrix& mat) const;
bool operator> (const GMatrix& mat) const;
bool operator>= (const GMatrix& mat) const;
// Arithmetic operations. The matrices must be the same size (equal
// number of rows and equal number of columns) for the addition and
// subtraction of matrices. The number of columns of 'this' must
// equal the number of rows of 'mat' for multiplication of matrices.
GMatrix operator+ (const GMatrix& mat) const;
GMatrix operator- (const GMatrix& mat) const;
GMatrix operator* (const GMatrix& mat) const;
GMatrix operator* (Real scalar) const;
GMatrix operator/ (Real scalar) const;
GMatrix operator- () const;
// Arithmetic updates. The matrices must be the same size (equal
// number of rows and equal number of columns) for the addition and
// subtraction updates.
GMatrix& operator+= (const GMatrix& mat);
GMatrix& operator-= (const GMatrix& mat);
GMatrix& operator*= (Real scalar);
GMatrix& operator/= (Real scalar);
// M*v (numColumns(M) = size(v) is required)
GVector<Real> operator* (const GVector<Real>& vec) const;
// u^T*M*v (numColumns(M) = size(v) and numRows(M) = size(u) is required)
Real QForm (const GVector<Real>& u, const GVector<Real>& v) const;
// M^T
GMatrix Transpose () const;
// M^T*mat (numRows(M) = numRows(mat) is required)
GMatrix TransposeTimes (const GMatrix& mat) const;
// M*mat^T (numColumns(M) = numColumns(mat) is required)
GMatrix TimesTranspose (const GMatrix& mat) const;
// M^T*mat^T (numRows(M) = numColumns(mat) is required)
GMatrix TransposeTimesTranspose (const GMatrix& mat) const;
// c * M
friend GMatrix<Real> operator* (Real scalar, const GMatrix<Real>& mat)
{
return mat*scalar;
}
// v^T * M (numRows(M) = size(v) is required)
friend GVector<Real> operator* (const GVector<Real>& vec,
const GMatrix<Real>& mat)
{
#ifdef WM5_ASSERT_GMATRIX_OUT_OF_RANGE
assertion(vec.GetSize() == mat.GetNumRows(),
"Mismatch in operator*\n");
#endif
GVector<Real> product(mat.GetNumColumns());
Real* entry = product;
for (int c = 0; c < mat.GetNumColumns(); ++c)
{
for (int r = 0; r < mat.GetNumRows(); ++r)
{
entry[c] += vec[r]*mat[r][c];
}
}
return product;
}
protected:
// The matrix is stored in row-major form as a 1-dimensional array.
int mNumRows, mNumColumns, mNumElements;
Real** mEntry;
};
#include "Wm5GMatrix.inl"
typedef GMatrix<float> GMatrixf;
typedef GMatrix<double> GMatrixd;
}
#endif
|