Simple Vector Library 1.5 http://www.cs.cmu.edu/~ajw/doc/svl.html

Committer:
BartJanssens
Date:
Tue Jan 05 13:37:50 2016 +0000
Revision:
1:e25ff4b06ed2
Parent:
0:785cff1e5a7c
fixed va_list bug

Who changed what in which revision?

UserRevisionLine numberNew contents of line
BartJanssens 0:785cff1e5a7c 1 /*
BartJanssens 0:785cff1e5a7c 2 File: Mat.h
BartJanssens 0:785cff1e5a7c 3
BartJanssens 0:785cff1e5a7c 4 Function: Defines a generic resizeable matrix.
BartJanssens 0:785cff1e5a7c 5
BartJanssens 0:785cff1e5a7c 6 Author(s): Andrew Willmott
BartJanssens 0:785cff1e5a7c 7
BartJanssens 0:785cff1e5a7c 8 Copyright: (c) 1995-2001, Andrew Willmott
BartJanssens 0:785cff1e5a7c 9 */
BartJanssens 0:785cff1e5a7c 10
BartJanssens 0:785cff1e5a7c 11 #ifndef __Mat__
BartJanssens 0:785cff1e5a7c 12 #define __Mat__
BartJanssens 0:785cff1e5a7c 13
BartJanssens 0:785cff1e5a7c 14 #include "Vec.h"
BartJanssens 0:785cff1e5a7c 15 #include "Mat2.h"
BartJanssens 0:785cff1e5a7c 16 #include "Mat3.h"
BartJanssens 0:785cff1e5a7c 17 #include "Mat4.h"
BartJanssens 0:785cff1e5a7c 18
BartJanssens 0:785cff1e5a7c 19 class Mat2;
BartJanssens 0:785cff1e5a7c 20 class Mat3;
BartJanssens 0:785cff1e5a7c 21 class Mat4;
BartJanssens 0:785cff1e5a7c 22
BartJanssens 0:785cff1e5a7c 23
BartJanssens 0:785cff1e5a7c 24 // --- Mat Class --------------------------------------------------------------
BartJanssens 0:785cff1e5a7c 25
BartJanssens 0:785cff1e5a7c 26 class Mat
BartJanssens 0:785cff1e5a7c 27 {
BartJanssens 0:785cff1e5a7c 28 public:
BartJanssens 0:785cff1e5a7c 29
BartJanssens 0:785cff1e5a7c 30 // Constructors
BartJanssens 0:785cff1e5a7c 31
BartJanssens 0:785cff1e5a7c 32 Mat(); // Null matrix
BartJanssens 0:785cff1e5a7c 33 Mat(Int rows, Int cols); // Uninitialised matrix
BartJanssens 0:785cff1e5a7c 34 Mat(Int rows, Int cols, Double elt0 ...); // Mat(2, 2, 1.0, 2.0, 3.0, 4.0)
BartJanssens 0:785cff1e5a7c 35 Mat(Int nrows, Int ncols, Real *ndata); // Create reference matrix
BartJanssens 0:785cff1e5a7c 36 Mat(const Mat &m); // Copy constructor
BartJanssens 0:785cff1e5a7c 37 Mat(const Mat2 &m); // reference to a Mat2
BartJanssens 0:785cff1e5a7c 38 Mat(const Mat3 &m); // reference to a Mat3
BartJanssens 0:785cff1e5a7c 39 Mat(const Mat4 &m); // reference to a Mat4
BartJanssens 0:785cff1e5a7c 40 Mat(Int rows, Int cols, ZeroOrOne k); // I * k
BartJanssens 0:785cff1e5a7c 41 Mat(Int rows, Int cols, Block k); // block matrix (m[i][j] = k)
BartJanssens 0:785cff1e5a7c 42
BartJanssens 0:785cff1e5a7c 43 ~Mat();
BartJanssens 0:785cff1e5a7c 44
BartJanssens 0:785cff1e5a7c 45 // Accessor methods
BartJanssens 0:785cff1e5a7c 46
BartJanssens 0:785cff1e5a7c 47 Int Rows() const { return(rows & VL_REF_MASK); };
BartJanssens 0:785cff1e5a7c 48 Int Cols() const { return(cols); };
BartJanssens 0:785cff1e5a7c 49
BartJanssens 0:785cff1e5a7c 50 Vec operator [] (Int i); // Indexing by row
BartJanssens 0:785cff1e5a7c 51 Vec operator [] (Int i) const; // Indexing by row
BartJanssens 0:785cff1e5a7c 52
BartJanssens 0:785cff1e5a7c 53 Real &Elt(Int i, Int j); // Indexing by elt
BartJanssens 0:785cff1e5a7c 54 Real Elt(Int i, Int j) const;
BartJanssens 0:785cff1e5a7c 55
BartJanssens 0:785cff1e5a7c 56 Void SetSize(Int nrows, Int ncols);
BartJanssens 0:785cff1e5a7c 57 Void SetSize(const Mat &m);
BartJanssens 0:785cff1e5a7c 58 Bool IsSquare() const
BartJanssens 0:785cff1e5a7c 59 { return((rows & VL_REF_MASK) == cols); };
BartJanssens 0:785cff1e5a7c 60
BartJanssens 0:785cff1e5a7c 61 Real *Ref() const; // Return pointer to data
BartJanssens 0:785cff1e5a7c 62
BartJanssens 0:785cff1e5a7c 63 // Assignment operators
BartJanssens 0:785cff1e5a7c 64
BartJanssens 0:785cff1e5a7c 65 Mat &operator = (const Mat &m); // Assignment of a matrix
BartJanssens 0:785cff1e5a7c 66 Mat &operator = (ZeroOrOne k); // Set to k * I...
BartJanssens 0:785cff1e5a7c 67 Mat &operator = (Block k); // Set to a block matrix...
BartJanssens 0:785cff1e5a7c 68 Mat &operator = (const Mat2 &m);
BartJanssens 0:785cff1e5a7c 69 Mat &operator = (const Mat3 &m);
BartJanssens 0:785cff1e5a7c 70 Mat &operator = (const Mat4 &m);
BartJanssens 0:785cff1e5a7c 71
BartJanssens 0:785cff1e5a7c 72 // In-Place Operators
BartJanssens 0:785cff1e5a7c 73
BartJanssens 0:785cff1e5a7c 74 Mat &operator += (const Mat &m);
BartJanssens 0:785cff1e5a7c 75 Mat &operator -= (const Mat &m);
BartJanssens 0:785cff1e5a7c 76 Mat &operator *= (const Mat &m);
BartJanssens 0:785cff1e5a7c 77 Mat &operator *= (Real s);
BartJanssens 0:785cff1e5a7c 78 Mat &operator /= (Real s);
BartJanssens 0:785cff1e5a7c 79
BartJanssens 0:785cff1e5a7c 80 // Matrix initialisers
BartJanssens 0:785cff1e5a7c 81
BartJanssens 0:785cff1e5a7c 82 Void MakeZero();
BartJanssens 0:785cff1e5a7c 83 Void MakeDiag(Real k);
BartJanssens 0:785cff1e5a7c 84 Void MakeDiag();
BartJanssens 0:785cff1e5a7c 85 Void MakeBlock(Real k);
BartJanssens 0:785cff1e5a7c 86 Void MakeBlock();
BartJanssens 0:785cff1e5a7c 87
BartJanssens 0:785cff1e5a7c 88 Mat &Clamp(Real fuzz);
BartJanssens 0:785cff1e5a7c 89 Mat &Clamp();
BartJanssens 0:785cff1e5a7c 90
BartJanssens 0:785cff1e5a7c 91 // Private...
BartJanssens 0:785cff1e5a7c 92
BartJanssens 0:785cff1e5a7c 93 protected:
BartJanssens 0:785cff1e5a7c 94
BartJanssens 0:785cff1e5a7c 95 Real *data;
BartJanssens 0:785cff1e5a7c 96 UInt rows;
BartJanssens 0:785cff1e5a7c 97 UInt cols;
BartJanssens 0:785cff1e5a7c 98
BartJanssens 0:785cff1e5a7c 99 Bool IsRef() { return((rows & VL_REF_FLAG) != 0); };
BartJanssens 0:785cff1e5a7c 100 };
BartJanssens 0:785cff1e5a7c 101
BartJanssens 0:785cff1e5a7c 102
BartJanssens 0:785cff1e5a7c 103 // --- Mat Comparison Operators -----------------------------------------------
BartJanssens 0:785cff1e5a7c 104
BartJanssens 0:785cff1e5a7c 105 Bool operator == (const Mat &m, const Mat &n);
BartJanssens 0:785cff1e5a7c 106 Bool operator != (const Mat &m, const Mat &n);
BartJanssens 0:785cff1e5a7c 107
BartJanssens 0:785cff1e5a7c 108
BartJanssens 0:785cff1e5a7c 109 // --- Mat Arithmetic Operators -----------------------------------------------
BartJanssens 0:785cff1e5a7c 110
BartJanssens 0:785cff1e5a7c 111 Mat operator + (const Mat &m, const Mat &n);
BartJanssens 0:785cff1e5a7c 112 Mat operator - (const Mat &m, const Mat &n);
BartJanssens 0:785cff1e5a7c 113 Mat operator - (const Mat &m);
BartJanssens 0:785cff1e5a7c 114 Mat operator * (const Mat &m, const Mat &n);
BartJanssens 0:785cff1e5a7c 115 Mat operator * (const Mat &m, Real s);
BartJanssens 0:785cff1e5a7c 116 inline Mat operator * (Real s, const Mat &m);
BartJanssens 0:785cff1e5a7c 117 Mat operator / (const Mat &m, Real s);
BartJanssens 0:785cff1e5a7c 118
BartJanssens 0:785cff1e5a7c 119 Vec operator * (const Mat &m, const Vec &v);
BartJanssens 0:785cff1e5a7c 120 Vec operator * (const Vec &v, const Mat &m);
BartJanssens 0:785cff1e5a7c 121
BartJanssens 0:785cff1e5a7c 122 Mat trans(const Mat &m); // Transpose
BartJanssens 0:785cff1e5a7c 123 Real trace(const Mat &m); // Trace
BartJanssens 0:785cff1e5a7c 124 Mat inv(const Mat &m, Real *determinant = 0, Real pEps = 1e-20);
BartJanssens 0:785cff1e5a7c 125 // Inverse
BartJanssens 0:785cff1e5a7c 126 Mat oprod(const Vec &a, const Vec &b); // Outer product
BartJanssens 0:785cff1e5a7c 127
BartJanssens 0:785cff1e5a7c 128 Mat clamped(const Mat &m, Real fuzz);
BartJanssens 0:785cff1e5a7c 129 Mat clamped(const Mat &m);
BartJanssens 0:785cff1e5a7c 130
BartJanssens 0:785cff1e5a7c 131
BartJanssens 0:785cff1e5a7c 132 // --- Mat Input & Output -----------------------------------------------------
BartJanssens 0:785cff1e5a7c 133
BartJanssens 0:785cff1e5a7c 134 //std::ostream &operator << (std::ostream &s, const Mat &m);
BartJanssens 0:785cff1e5a7c 135 //std::istream &operator >> (std::istream &s, Mat &m);
BartJanssens 0:785cff1e5a7c 136
BartJanssens 0:785cff1e5a7c 137 void printMat(const Mat &m);
BartJanssens 0:785cff1e5a7c 138
BartJanssens 0:785cff1e5a7c 139
BartJanssens 0:785cff1e5a7c 140 // --- Mat Inlines ------------------------------------------------------------
BartJanssens 0:785cff1e5a7c 141
BartJanssens 0:785cff1e5a7c 142 inline Mat::Mat() : data(0), rows(0), cols(0)
BartJanssens 0:785cff1e5a7c 143 {
BartJanssens 0:785cff1e5a7c 144 }
BartJanssens 0:785cff1e5a7c 145
BartJanssens 0:785cff1e5a7c 146 inline Mat::Mat(Int rows, Int cols) : rows(rows), cols(cols)
BartJanssens 0:785cff1e5a7c 147 {
BartJanssens 0:785cff1e5a7c 148 Assert(rows > 0 && cols > 0, "(Mat) illegal matrix size");
BartJanssens 0:785cff1e5a7c 149
BartJanssens 0:785cff1e5a7c 150 data = new Real[rows * cols];
BartJanssens 0:785cff1e5a7c 151 }
BartJanssens 0:785cff1e5a7c 152
BartJanssens 0:785cff1e5a7c 153 inline Mat::Mat(Int nrows, Int ncols, Real *ndata) :
BartJanssens 0:785cff1e5a7c 154 data(ndata), rows(nrows | VL_REF_FLAG), cols(ncols)
BartJanssens 0:785cff1e5a7c 155 {
BartJanssens 0:785cff1e5a7c 156 }
BartJanssens 0:785cff1e5a7c 157
BartJanssens 0:785cff1e5a7c 158 inline Vec Mat::operator [] (Int i)
BartJanssens 0:785cff1e5a7c 159 {
BartJanssens 0:785cff1e5a7c 160 CheckRange(i, 0, Rows(), "(Mat::[i]) i index out of range");
BartJanssens 0:785cff1e5a7c 161
BartJanssens 0:785cff1e5a7c 162 return(Vec(cols, data + i * cols));
BartJanssens 0:785cff1e5a7c 163 }
BartJanssens 0:785cff1e5a7c 164
BartJanssens 0:785cff1e5a7c 165 inline Vec Mat::operator [] (Int i) const
BartJanssens 0:785cff1e5a7c 166 {
BartJanssens 0:785cff1e5a7c 167 CheckRange(i, 0, Rows(), "(Mat::[i]) i index out of range");
BartJanssens 0:785cff1e5a7c 168
BartJanssens 0:785cff1e5a7c 169 return(Vec(cols, data + i * cols));
BartJanssens 0:785cff1e5a7c 170 }
BartJanssens 0:785cff1e5a7c 171
BartJanssens 0:785cff1e5a7c 172 inline Real &Mat::Elt(Int i, Int j)
BartJanssens 0:785cff1e5a7c 173 {
BartJanssens 0:785cff1e5a7c 174 CheckRange(i, 0, Rows(), "(Mat::e(i,j)) i index out of range");
BartJanssens 0:785cff1e5a7c 175 CheckRange(j, 0, Cols(), "(Mat::e(i,j)) j index out of range");
BartJanssens 0:785cff1e5a7c 176
BartJanssens 0:785cff1e5a7c 177 return(data[i * cols + j]);
BartJanssens 0:785cff1e5a7c 178 }
BartJanssens 0:785cff1e5a7c 179
BartJanssens 0:785cff1e5a7c 180 inline Real Mat::Elt(Int i, Int j) const
BartJanssens 0:785cff1e5a7c 181 {
BartJanssens 0:785cff1e5a7c 182 CheckRange(i, 0, Rows(), "(Mat::e(i,j)) i index out of range");
BartJanssens 0:785cff1e5a7c 183 CheckRange(j, 0, Cols(), "(Mat::e(i,j)) j index out of range");
BartJanssens 0:785cff1e5a7c 184
BartJanssens 0:785cff1e5a7c 185 return(data[i * cols + j]);
BartJanssens 0:785cff1e5a7c 186 }
BartJanssens 0:785cff1e5a7c 187
BartJanssens 0:785cff1e5a7c 188 inline Real *Mat::Ref() const
BartJanssens 0:785cff1e5a7c 189 {
BartJanssens 0:785cff1e5a7c 190 return(data);
BartJanssens 0:785cff1e5a7c 191 }
BartJanssens 0:785cff1e5a7c 192
BartJanssens 0:785cff1e5a7c 193 inline Mat operator * (Real s, const Mat &m)
BartJanssens 0:785cff1e5a7c 194 {
BartJanssens 0:785cff1e5a7c 195 return(m * s);
BartJanssens 0:785cff1e5a7c 196 }
BartJanssens 0:785cff1e5a7c 197
BartJanssens 0:785cff1e5a7c 198 inline Mat &Mat::operator = (ZeroOrOne k)
BartJanssens 0:785cff1e5a7c 199 {
BartJanssens 0:785cff1e5a7c 200 MakeDiag(k);
BartJanssens 0:785cff1e5a7c 201
BartJanssens 0:785cff1e5a7c 202 return(SELF);
BartJanssens 0:785cff1e5a7c 203 }
BartJanssens 0:785cff1e5a7c 204
BartJanssens 0:785cff1e5a7c 205 inline Mat &Mat::operator = (Block k)
BartJanssens 0:785cff1e5a7c 206 {
BartJanssens 0:785cff1e5a7c 207 MakeBlock((ZeroOrOne) k);
BartJanssens 0:785cff1e5a7c 208
BartJanssens 0:785cff1e5a7c 209 return(SELF);
BartJanssens 0:785cff1e5a7c 210 }
BartJanssens 0:785cff1e5a7c 211
BartJanssens 0:785cff1e5a7c 212 inline Mat::~Mat()
BartJanssens 0:785cff1e5a7c 213 {
BartJanssens 0:785cff1e5a7c 214 if (!IsRef())
BartJanssens 0:785cff1e5a7c 215 delete[] data;
BartJanssens 0:785cff1e5a7c 216 }
BartJanssens 0:785cff1e5a7c 217
BartJanssens 0:785cff1e5a7c 218 #endif