/usr/include/simbody/simmath/LinearAlgebra.h is in libsimbody-dev 3.5.4+dfsg-1ubuntu2.
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 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 | #ifndef SimTK_LINEAR_ALGEBRA_H_
#define SimTK_LINEAR_ALGEBRA_H_
/* -------------------------------------------------------------------------- *
* Simbody(tm): SimTKmath *
* -------------------------------------------------------------------------- *
* This is part of the SimTK biosimulation toolkit originating from *
* Simbios, the NIH National Center for Physics-Based Simulation of *
* Biological Structures at Stanford, funded under the NIH Roadmap for *
* Medical Research, grant U54 GM072970. See https://simtk.org/home/simbody. *
* *
* Portions copyright (c) 2006-12 Stanford University and the Authors. *
* Authors: Jack Middleton *
* Contributors: Michael Sherman *
* *
* Licensed under the Apache License, Version 2.0 (the "License"); you may *
* not use this file except in compliance with the License. You may obtain a *
* copy of the License at http://www.apache.org/licenses/LICENSE-2.0. *
* *
* Unless required by applicable law or agreed to in writing, software *
* distributed under the License is distributed on an "AS IS" BASIS, *
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
* See the License for the specific language governing permissions and *
* limitations under the License. *
* -------------------------------------------------------------------------- */
/** @file
* This is the header file that user code should include to pick up the
* SimTK Simmath linear algebra tools.
*/
#include "SimTKcommon.h"
#include "simmath/internal/common.h"
namespace SimTK {
// default for reciprocal of the condition number
// TODO: sherm 080128 I changed this from 0.01 to a more reasonable
// value but it is still wrong because the default should depend
// on the matrix size, something like max(m,n)*eps^(7/8) where
// eps is machine precision for float or double as appropriate.
static const double DefaultRecpCondition = 1e-12;
/**
* Base class for the various matrix factorizations.
*/
class SimTK_SIMMATH_EXPORT Factor {
public:
Factor() {}
/// creates an factorization of a matrix
template <class ELT> Factor( Matrix_<ELT> m );
/// solves a single right hand side using a factorization
template <class ELT> void solve( const Vector_<ELT>& b, Vector_<ELT>& x ) const;
/// solves multiple right hand sides using a factorization
template <class ELT> void solve( const Matrix_<ELT>& b, Matrix_<ELT>& x ) const;
}; // class Factor
class FactorLURepBase;
/**
* Class for performing LU matrix factorizations
*/
class SimTK_SIMMATH_EXPORT FactorLU: public Factor {
public:
~FactorLU();
FactorLU();
FactorLU( const FactorLU& c );
FactorLU& operator=(const FactorLU& rhs);
template <class ELT> FactorLU( const Matrix_<ELT>& m );
/// factors a matrix
template <class ELT> void factor( const Matrix_<ELT>& m );
/// solves a single right hand side
template <class ELT> void solve( const Vector_<ELT>& b, Vector_<ELT>& x ) const;
/// solves multiple right hand sides
template <class ELT> void solve( const Matrix_<ELT>& b, Matrix_<ELT>& x ) const;
/// returns the lower triangle of an LU factorization
template <class ELT> void getL( Matrix_<ELT>& l ) const;
/// returns the upper triangle of an LU factorization
template <class ELT> void getU( Matrix_<ELT>& u ) const;
/// returns the inverse of a matrix using an LU factorization
template < class ELT > void inverse( Matrix_<ELT>& m ) const;
/// returns true if matrix was singular
bool isSingular() const;
/// returns the first diagonal which was found to be singular
int getSingularIndex() const;
protected:
class FactorLURepBase *rep;
}; // class FactorLU
class FactorQTZRepBase;
/**
* Class to perform a QTZ (linear least squares) factorization
*/
class SimTK_SIMMATH_EXPORT FactorQTZ: public Factor {
public:
~FactorQTZ();
FactorQTZ();
FactorQTZ( const FactorQTZ& c );
FactorQTZ& operator=(const FactorQTZ& rhs);
/// do QTZ factorization of a matrix
template <typename ELT> FactorQTZ( const Matrix_<ELT>& m);
/// do QTZ factorization of a matrix for a given reciprocal condition number
template <typename ELT> FactorQTZ( const Matrix_<ELT>& m, double rcond );
/// do QTZ factorization of a matrix for a given reciprocal condition number
template <typename ELT> FactorQTZ( const Matrix_<ELT>& m, float rcond );
/// do QTZ factorization of a matrix
template <typename ELT> void factor( const Matrix_<ELT>& m);
/// do QTZ factorization of a matrix for a given reciprocal condition number
template <typename ELT> void factor( const Matrix_<ELT>& m, float rcond );
/// do QTZ factorization of a matrix for a given reciprocal condition number
template <typename ELT> void factor( const Matrix_<ELT>& m, double rcond );
/// solve for a vector x given a right hand side vector b
template <typename ELT> void solve( const Vector_<ELT>& b, Vector_<ELT>& x ) const;
/// solve for an array of vectors given multiple right hand sides
template <typename ELT> void solve( const Matrix_<ELT>& b, Matrix_<ELT>& x ) const;
template < class ELT > void inverse( Matrix_<ELT>& m ) const;
/// returns the rank of the matrix
int getRank() const;
/// returns the actual reciprocal condition number at this rank
double getRCondEstimate() const;
// void setRank(int rank); TBD
protected:
class FactorQTZRepBase *rep;
}; // class FactorQTZ
/**
* Class to compute Eigen values and Eigen vectors of a matrix
*/
class SimTK_SIMMATH_EXPORT Eigen {
public:
~Eigen();
Eigen();
Eigen( const Eigen& c );
Eigen& operator=(const Eigen& rhs);
/// create a default eigen class
template <class ELT> Eigen( const Matrix_<ELT>& m );
/// supply matrix which eigen values will be computed for
template <class ELT> void factor( const Matrix_<ELT>& m );
/// get all the eigen values and eigen vectors of a matrix
template <class VAL, class VEC> void getAllEigenValuesAndVectors( Vector_<VAL>& values, Matrix_<VEC>& vectors);
/// get all the eigen values of a matrix
template <class T> void getAllEigenValues( Vector_<T>& values);
/// get a few eigen values and eigen vectors of a symmetric matrix which are within a range of indices
template <class VAL, class VEC> void getFewEigenValuesAndVectors( Vector_<VAL>& values, Matrix_<VEC>& vectors, int ilow, int ihi);
/// get a few eigen vectors of a symmetric matrix which are within a range of indices
template <class T> void getFewEigenVectors( Matrix_<T>& vectors, int ilow, int ihi );
/// get a few eigen values of a symmetric matrix which are within a range of indices
template <class T> void getFewEigenValues( Vector_<T>& values, int ilow, int ihi );
/// get a few eigen values and eigen vectors of a symmetric matrix which are within a range of eigen values
template <class VAL, class VEC> void getFewEigenValuesAndVectors( Vector_<VAL>& values, Matrix_<VEC>& vectors, typename CNT<VAL>::TReal rlow, typename CNT<VAL>::TReal rhi);
/// get a few eigen vectors of a symmetric matrix which are within a range of eigen values
template <class T> void getFewEigenVectors( Matrix_<T>& vectors, typename CNT<T>::TReal rlow, typename CNT<T>::TReal rhi );
/// get a few eigen values of a symmetric matrix which are within a range of eigen values
template <class T> void getFewEigenValues( Vector_<T>& values, typename CNT<T>::TReal rlow, typename CNT<T>::TReal rhi );
protected:
class EigenRepBase *rep;
}; // class Eigen
/**
* Class to compute a singular value decomposition of a matrix
*/
class SimTK_SIMMATH_EXPORT FactorSVD: public Factor {
public:
~FactorSVD();
/// default constructor
FactorSVD();
/// copy constructor
FactorSVD( const FactorSVD& c );
/// copy assign
FactorSVD& operator=(const FactorSVD& rhs);
/// constructor
template < class ELT > FactorSVD( const Matrix_<ELT>& m );
/// singular value decomposition of a matrix using the specified reciprocal of the condition
/// number rcond
template < class ELT > FactorSVD( const Matrix_<ELT>& m, float rcond );
/// singular value decomposition of a matrix using the specified reciprocal of the condition
/// number rcond
template < class ELT > FactorSVD( const Matrix_<ELT>& m, double rcond );
/// supply the matrix to do a singular value decomposition
template < class ELT > void factor( const Matrix_<ELT>& m );
/// supply the matrix to do a singular value decomposition using the specified
/// reciprocal of the condition number rcond
template < class ELT > void factor( const Matrix_<ELT>& m, float rcond );
/// supply the matrix to do a singular value decomposition using the specified reciprocal of the condition
/// reciprocal of the condition number rcond
template < class ELT > void factor( const Matrix_<ELT>& m, double rcond );
/// get the singular values and singular vectors of the matrix
template < class T > void getSingularValuesAndVectors( Vector_<typename CNT<T>::TReal>& values,
Matrix_<T>& leftVectors, Matrix_<T>& rightVectors );
/// get just the singular values of the matrix
template < class T > void getSingularValues( Vector_<T>& values);
/// get rank of the matrix
int getRank();
/// get inverse of the matrix using singular value decomposition (sometimes called the pseudo inverse)
template < class ELT > void inverse( Matrix_<ELT>& m );
/// solve for x given a right hand side vector using the singular value decomposition
template <class ELT> void solve( const Vector_<ELT>& b, Vector_<ELT>& x );
/// solve for a set of x vectors given multiple right hand side vectors
/// using the singular value decomposition
template <class ELT> void solve( const Matrix_<ELT>& b, Matrix_<ELT>& x );
protected:
class FactorSVDRepBase *rep;
}; // class FactorSVD
} // namespace SimTK
#endif //SimTK_LINEAR_ALGEBRA_H_
|