1 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4 Author: Tony Peden, Jon Berndt, Mathias Frolich
7 ------------- Copyright (C) 2001 Jon S. Berndt (jon@jsbsim.org) -------------
9 This program is free software; you can redistribute it and/or modify it under
10 the terms of the GNU Lesser General Public License as published by the Free Software
11 Foundation; either version 2 of the License, or (at your option) any later
14 This program is distributed in the hope that it will be useful, but WITHOUT
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
19 You should have received a copy of the GNU Lesser General Public License along with
20 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
21 Place - Suite 330, Boston, MA 02111-1307, USA.
23 Further information about the GNU Lesser General Public License can also be found on
24 the world wide web at http://www.gnu.org.
27 --------------------------------------------------------------------------------
29 03/16/2000 JSB Added exception throwing
30 03/06/2004 MF Rework of the code to make it a bit compiler friendlier
32 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
34 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
39 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
41 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
46 #include "FGColumnVector3.h"
48 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
50 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
52 #define ID_MATRIX33 "$Id: FGMatrix33.h,v 1.14 2010/12/07 12:57:14 jberndt Exp $"
54 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
56 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
60 class FGColumnVector3;
63 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
65 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
67 /** Exception convenience class.
70 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
71 DECLARATION: MatrixException
72 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
74 class MatrixException //: public FGJSBBase
80 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
82 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
84 /** Handles matrix math operations.
85 @author Tony Peden, Jon Berndt, Mathias Froelich
88 /*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
89 DECLARATION: FGMatrix33
90 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
101 /** Default initializer.
103 Create a zero matrix.
107 /** Copy constructor.
109 @param M Matrix which is used for initialization.
111 Create copy of the matrix given in the argument.
113 FGMatrix33(const FGMatrix33& M)
126 /** Initialization by given values.
128 @param m11 value of the 1,1 Matrix element.
129 @param m12 value of the 1,2 Matrix element.
130 @param m13 value of the 1,3 Matrix element.
131 @param m21 value of the 2,1 Matrix element.
132 @param m22 value of the 2,2 Matrix element.
133 @param m23 value of the 2,3 Matrix element.
134 @param m31 value of the 3,1 Matrix element.
135 @param m32 value of the 3,2 Matrix element.
136 @param m33 value of the 3,3 Matrix element.
138 Create a matrix from the doubles given in the arguments.
140 FGMatrix33(const double m11, const double m12, const double m13,
141 const double m21, const double m22, const double m23,
142 const double m31, const double m32, const double m33)
159 /** Prints the contents of the matrix.
160 @param delimeter the item separator (tab or comma)
161 @return a string with the delimeter-separated contents of the matrix */
162 std::string Dump(const std::string& delimeter) const;
164 /** Prints the contents of the matrix.
165 @param delimeter the item separator (tab or comma, etc.)
166 @param prefix an additional prefix that is used to indent the 3X3 matrix printout
167 @return a string with the delimeter-separated contents of the matrix */
168 std::string Dump(const std::string& delimiter, const std::string& prefix) const;
170 /** Read access the entries of the matrix.
171 @param row Row index.
172 @param col Column index.
174 @return the value of the matrix entry at the given row and
175 column indices. Indices are counted starting with 1.
177 double operator()(unsigned int row, unsigned int col) const {
178 return data[(col-1)*eRows+row-1];
181 /** Write access the entries of the matrix.
182 Note that the indices given in the arguments are unchecked.
184 @param row Row index.
185 @param col Column index.
187 @return a reference to the matrix entry at the given row and
188 column indices. Indices are counted starting with 1.
190 double& operator()(unsigned int row, unsigned int col) {
191 return data[(col-1)*eRows+row-1];
194 /** Read access the entries of the matrix.
195 This function is just a shortcut for the <tt>double&
196 operator()(unsigned int row, unsigned int col)</tt> function. It is
197 used internally to access the elements in a more convenient way.
199 Note that the indices given in the arguments are unchecked.
201 @param row Row index.
202 @param col Column index.
204 @return the value of the matrix entry at the given row and
205 column indices. Indices are counted starting with 1.
207 double Entry(unsigned int row, unsigned int col) const {
208 return data[(col-1)*eRows+row-1];
211 /** Write access the entries of the matrix.
212 This function is just a shortcut for the <tt>double&
213 operator()(unsigned int row, unsigned int col)</tt> function. It is
214 used internally to access the elements in a more convenient way.
216 Note that the indices given in the arguments are unchecked.
218 @param row Row index.
219 @param col Column index.
221 @return a reference to the matrix entry at the given row and
222 column indices. Indices are counted starting with 1.
224 double& Entry(unsigned int row, unsigned int col) {
225 return data[(col-1)*eRows+row-1];
228 /** Number of rows in the matrix.
229 @return the number of rows in the matrix.
231 unsigned int Rows(void) const { return eRows; }
233 /** Number of cloumns in the matrix.
234 @return the number of columns in the matrix.
236 unsigned int Cols(void) const { return eColumns; }
238 /** Transposed matrix.
239 This function only returns the transpose of this matrix. This matrix itself
241 @return the transposed matrix.
243 FGMatrix33 Transposed(void) const {
244 return FGMatrix33( data[0], data[1], data[2],
245 data[3], data[4], data[5],
246 data[6], data[7], data[8] );
249 /** Transposes this matrix.
250 This function only transposes this matrix. Nothing is returned.
254 /** Initialize the matrix.
255 This function initializes a matrix to all 0.0.
257 void InitMatrix(void);
259 /** Initialize the matrix.
260 This function initializes a matrix to user specified values.
262 void InitMatrix(const double m11, const double m12, const double m13,
263 const double m21, const double m22, const double m23,
264 const double m31, const double m32, const double m33)
277 /** Returns the quaternion associated with this direction cosine (rotation) matrix.
279 FGQuaternion GetQuaternion(void);
281 /** Determinant of the matrix.
282 @return the determinant of the matrix.
284 double Determinant(void) const;
286 /** Return if the matrix is invertible.
287 Checks and returns if the matrix is nonsingular and thus
288 invertible. This is done by simply computing the determinant and
289 check if it is zero. Note that this test does not cover any
290 instabilities caused by nearly singular matirces using finite
291 arithmetics. It only checks exact singularity.
293 bool Invertible(void) const { return 0.0 != Determinant(); }
295 /** Return the inverse of the matrix.
296 Computes and returns if the inverse of the matrix. It is computed
297 by Cramers Rule. Also there are no checks performed if the matrix
298 is invertible. If you are not sure that it really is check this
299 with the @ref Invertible() call before.
301 FGMatrix33 Inverse(void) const;
303 /** Assignment operator.
305 @param A source matrix.
307 Copy the content of the matrix given in the argument into *this.
309 FGMatrix33& operator=(const FGMatrix33& A)
323 /** Matrix vector multiplication.
325 @param v vector to multiply with.
326 @return matric vector product.
328 Compute and return the product of the current matrix with the
329 vector given in the argument.
331 FGColumnVector3 operator*(const FGColumnVector3& v) const;
333 /** Matrix subtraction.
335 @param B matrix to add to.
336 @return difference of the matrices.
338 Compute and return the sum of the current matrix and the matrix
339 B given in the argument.
341 FGMatrix33 operator-(const FGMatrix33& B) const;
345 @param B matrix to add to.
346 @return sum of the matrices.
348 Compute and return the sum of the current matrix and the matrix
349 B given in the argument.
351 FGMatrix33 operator+(const FGMatrix33& B) const;
355 @param B matrix to add to.
356 @return product of the matrices.
358 Compute and return the product of the current matrix and the matrix
359 B given in the argument.
361 FGMatrix33 operator*(const FGMatrix33& B) const;
363 /** Multiply the matrix with a scalar.
365 @param scalar scalar factor to multiply with.
366 @return scaled matrix.
368 Compute and return the product of the current matrix with the
369 scalar value scalar given in the argument.
371 FGMatrix33 operator*(const double scalar) const;
373 /** Multiply the matrix with 1.0/scalar.
375 @param scalar scalar factor to divide through.
376 @return scaled matrix.
378 Compute and return the product of the current matrix with the
379 scalar value 1.0/scalar, where scalar is given in the argument.
381 FGMatrix33 operator/(const double scalar) const;
383 /** In place matrix subtraction.
385 @param B matrix to subtract.
386 @return reference to the current matrix.
388 Compute the diffence from the current matrix and the matrix B
389 given in the argument.
391 FGMatrix33& operator-=(const FGMatrix33 &B);
393 /** In place matrix addition.
395 @param B matrix to add.
396 @return reference to the current matrix.
398 Compute the sum of the current matrix and the matrix B
399 given in the argument.
401 FGMatrix33& operator+=(const FGMatrix33 &B);
403 /** In place matrix multiplication.
405 @param B matrix to multiply with.
406 @return reference to the current matrix.
408 Compute the product of the current matrix and the matrix B
409 given in the argument.
411 FGMatrix33& operator*=(const FGMatrix33 &B);
413 /** In place matrix scale.
415 @param scalar scalar value to multiply with.
416 @return reference to the current matrix.
418 Compute the product of the current matrix and the scalar value scalar
419 given in the argument.
421 FGMatrix33& operator*=(const double scalar);
423 /** In place matrix scale.
425 @param scalar scalar value to divide through.
426 @return reference to the current matrix.
428 Compute the product of the current matrix and the scalar value
429 1.0/scalar, where scalar is given in the argument.
431 FGMatrix33& operator/=(const double scalar);
434 double data[eRows*eColumns];
437 /** Scalar multiplication.
439 @param scalar scalar value to multiply with.
440 @param A Matrix to multiply.
442 Multiply the Matrix with a scalar value.
444 inline FGMatrix33 operator*(double scalar, const FGMatrix33& A) {
445 // use already defined operation.
449 /** Write matrix to a stream.
451 @param os Stream to write to.
452 @param M Matrix to write.
454 Write the matrix to a stream.
456 std::ostream& operator<<(std::ostream& os, const FGMatrix33& M);
458 /** Read matrix from a stream.
460 @param os Stream to read from.
461 @param M Matrix to initialize with the values from the stream.
463 Read matrix from a stream.
465 std::istream& operator>>(std::istream& is, FGMatrix33& M);
467 } // namespace JSBSim
469 #include "FGQuaternion.h"