Simbody
3.5
|
This file defines the client side of the SimTK::Matrix classes, which hold medium to large, variable-sized matrices whose elements are packed SimTK "Composite Numerical Types" (CNTs). More...
Go to the source code of this file.
Classes | |
class | SimTK::MatrixBase< ELT > |
This is the common base class for Simbody's Vector_ and Matrix_ classes for handling large, variable-sized vectors and matrices. More... | |
class | SimTK::VectorBase< ELT > |
This is a dataless rehash of the MatrixBase class to specialize it for Vectors. More... | |
class | SimTK::RowVectorBase< ELT > |
This is a dataless rehash of the MatrixBase class to specialize it for RowVectors. More... | |
class | SimTK::MatrixView_< ELT > |
(Advanced) This class is identical to Matrix_ except that it has shallow (reference) copy and assignment semantics. More... | |
class | SimTK::Matrix_< ELT > |
This is the matrix class intended to appear in user code for large, variable size matrices. More... | |
class | SimTK::VectorView_< ELT > |
(Advanced) This class is identical to Vector_ except that it has shallow (reference) copy and assignment semantics. More... | |
class | SimTK::Vector_< ELT > |
This is the vector class intended to appear in user code for large, variable size column vectors. More... | |
class | SimTK::RowVectorView_< ELT > |
(Advanced) This class is identical to RowVector_ except that it has shallow (reference) copy and assignment semantics. More... | |
class | SimTK::RowVector_< ELT > |
Represents a variable size row vector; much less common than the column vector type Vector_. More... | |
class | SimTK::VectorIterator< ELT, VECTOR_CLASS > |
This is an iterator for iterating over the elements of a Vector_ or Vec object. More... | |
Namespaces | |
SimTK | |
This is the top-level SimTK namespace into which all SimTK names are placed to avoid collision with other symbols. | |
Typedefs | |
typedef Vector_< Real > | SimTK::Vector |
Variable-size column vector of Real elements; abbreviation for Vector_<Real>. More... | |
typedef Matrix_< Real > | SimTK::Matrix |
Variable-size 2D matrix of Real elements; abbreviation for Matrix_<Real>. More... | |
typedef RowVector_< Real > | SimTK::RowVector |
Variable-size row vector of Real elements; abbreviation for RowVector_<Real>. More... | |
typedef Vector_< Complex > | SimTK::ComplexVector |
Variable-size column vector of Complex (std::complex<Real>) elements. More... | |
typedef Matrix_< Complex > | SimTK::ComplexMatrix |
Variable-size 2D matrix of Complex (std::complex<Real>) elements. More... | |
typedef RowVector_< Complex > | SimTK::ComplexRowVector |
Variable-size row vector of Complex (std::complex<Real>) elements. More... | |
typedef VectorView_< Real > | SimTK::VectorView |
Non-owner column vector sharing Real elements. More... | |
typedef MatrixView_< Real > | SimTK::MatrixView |
Non-owner matrix sharing Real elements. More... | |
typedef RowVectorView_< Real > | SimTK::RowVectorView |
Non-owner row vector sharing Real elements. More... | |
typedef VectorView_< Complex > | SimTK::ComplexVectorView |
Non-owner column vector sharing Complex (std::complex<Real>) elements. More... | |
typedef MatrixView_< Complex > | SimTK::ComplexMatrixView |
Non-owner matrix sharing Complex (std::complex<Real>) elements. More... | |
typedef RowVectorView_< Complex > | SimTK::ComplexRowVectorView |
Non-owner row vector sharing Complex (std::complex<Real>) elements. More... | |
typedef Vector_< float > | SimTK::fVector |
Abbreviation for Vector_<float>. More... | |
typedef Vector_< double > | SimTK::dVector |
Abbreviation for Vector_<double>. More... | |
typedef Vector_< fComplex > | SimTK::fComplexVector |
Abbreviation for Vector_<std::complex<float>>. More... | |
typedef Vector_< dComplex > | SimTK::dComplexVector |
Abbreviation for Vector_<std::complex<double>>. More... | |
typedef VectorView_< float > | SimTK::fVectorView |
Abbreviation for VectorView_<float>. More... | |
typedef VectorView_< double > | SimTK::dVectorView |
Abbreviation for VectorView_<double>. More... | |
typedef VectorView_< fComplex > | SimTK::fComplexVectorView |
Abbreviation for VectorView_<std::complex<float>>. More... | |
typedef VectorView_< dComplex > | SimTK::dComplexVectorView |
Abbreviation for VectorView_<std::complex<double>>. More... | |
typedef RowVector_< float > | SimTK::fRowVector |
Abbreviation for RowVector_<float>. More... | |
typedef RowVector_< double > | SimTK::dRowVector |
Abbreviation for RowVector_<double>. More... | |
typedef RowVector_< fComplex > | SimTK::fComplexRowVector |
Abbreviation for RowVector_<std::complex<float>>. More... | |
typedef RowVector_< dComplex > | SimTK::dComplexRowVector |
Abbreviation for RowVector_<std::complex<double>>. More... | |
typedef RowVectorView_< float > | SimTK::fRowVectorView |
Abbreviation for RowVectorView_<float>. More... | |
typedef RowVectorView_< double > | SimTK::dRowVectorView |
Abbreviation for RowVectorView_<double>. More... | |
typedef RowVectorView_< fComplex > | SimTK::fComplexRowVectorView |
Abbreviation for RowVectorView_<std::complex<float>>. More... | |
typedef RowVectorView_< dComplex > | SimTK::dComplexRowVectorView |
Abbreviation for RowVectorView_<std::complex<double>>. More... | |
typedef Matrix_< float > | SimTK::fMatrix |
Abbreviation for Matrix_<float>. More... | |
typedef Matrix_< double > | SimTK::dMatrix |
Abbreviation for Matrix_<double>. More... | |
typedef Matrix_< fComplex > | SimTK::fComplexMatrix |
Abbreviation for Matrix_<std::complex<float>>. More... | |
typedef Matrix_< dComplex > | SimTK::dComplexMatrix |
Abbreviation for Matrix_<std::complex<double>>. More... | |
typedef MatrixView_< float > | SimTK::fMatrixView |
Abbreviation for MatrixView_<float>. More... | |
typedef MatrixView_< double > | SimTK::dMatrixView |
Abbreviation for MatrixView_<double>. More... | |
typedef MatrixView_< fComplex > | SimTK::fComplexMatrixView |
Abbreviation for MatrixView_<std::complex<float>>. More... | |
typedef MatrixView_< dComplex > | SimTK::dComplexMatrixView |
Abbreviation for MatrixView_<std::complex<double>>. More... | |
Functions | |
template<class T > | |
static std::istream & | SimTK::readVectorFromStreamHelper (std::istream &in, bool isFixedSize, Vector_< T > &out) |
Global operators involving Matrix objects | |
These operators take MatrixBase arguments and produce Matrix_ results. | |
template<class E1 , class E2 > | |
Matrix_< typename CNT< E1 >::template Result< E2 >::Add > | SimTK::operator+ (const MatrixBase< E1 > &l, const MatrixBase< E2 > &r) |
template<class E > | |
Matrix_< E > | SimTK::operator+ (const MatrixBase< E > &l, const typename CNT< E >::T &r) |
template<class E > | |
Matrix_< E > | SimTK::operator+ (const typename CNT< E >::T &l, const MatrixBase< E > &r) |
template<class E1 , class E2 > | |
Matrix_< typename CNT< E1 >::template Result< E2 >::Sub > | SimTK::operator- (const MatrixBase< E1 > &l, const MatrixBase< E2 > &r) |
template<class E > | |
Matrix_< E > | SimTK::operator- (const MatrixBase< E > &l, const typename CNT< E >::T &r) |
template<class E > | |
Matrix_< E > | SimTK::operator- (const typename CNT< E >::T &l, const MatrixBase< E > &r) |
template<class E > | |
Matrix_< E > | SimTK::operator* (const MatrixBase< E > &l, const typename CNT< E >::StdNumber &r) |
template<class E > | |
Matrix_< E > | SimTK::operator* (const typename CNT< E >::StdNumber &l, const MatrixBase< E > &r) |
template<class E > | |
Matrix_< E > | SimTK::operator/ (const MatrixBase< E > &l, const typename CNT< E >::StdNumber &r) |
template<class E > | |
Matrix_< E > | SimTK::operator* (const MatrixBase< E > &l, int r) |
template<class E > | |
Matrix_< E > | SimTK::operator* (int l, const MatrixBase< E > &r) |
template<class E > | |
Matrix_< E > | SimTK::operator/ (const MatrixBase< E > &l, int r) |
Global operators involving Vector objects | |
These operators take VectorBase arguments and produce Vector_ results. | |
template<class E1 , class E2 > | |
Vector_< typename CNT< E1 >::template Result< E2 >::Add > | SimTK::operator+ (const VectorBase< E1 > &l, const VectorBase< E2 > &r) |
template<class E > | |
Vector_< E > | SimTK::operator+ (const VectorBase< E > &l, const typename CNT< E >::T &r) |
template<class E > | |
Vector_< E > | SimTK::operator+ (const typename CNT< E >::T &l, const VectorBase< E > &r) |
template<class E1 , class E2 > | |
Vector_< typename CNT< E1 >::template Result< E2 >::Sub > | SimTK::operator- (const VectorBase< E1 > &l, const VectorBase< E2 > &r) |
template<class E > | |
Vector_< E > | SimTK::operator- (const VectorBase< E > &l, const typename CNT< E >::T &r) |
template<class E > | |
Vector_< E > | SimTK::operator- (const typename CNT< E >::T &l, const VectorBase< E > &r) |
template<class E > | |
Vector_< E > | SimTK::operator* (const VectorBase< E > &l, const typename CNT< E >::StdNumber &r) |
template<class E > | |
Vector_< E > | SimTK::operator* (const typename CNT< E >::StdNumber &l, const VectorBase< E > &r) |
template<class E > | |
Vector_< E > | SimTK::operator/ (const VectorBase< E > &l, const typename CNT< E >::StdNumber &r) |
template<class E > | |
Vector_< E > | SimTK::operator* (const VectorBase< E > &l, int r) |
template<class E > | |
Vector_< E > | SimTK::operator* (int l, const VectorBase< E > &r) |
template<class E > | |
Vector_< E > | SimTK::operator/ (const VectorBase< E > &l, int r) |
template<class E1 , int M, class E2 , int S> | |
Vector_< typename CNT< E1 >::template Result< Vec< M, E2, S > >::Mul > | SimTK::operator* (const VectorBase< E1 > &v, const Vec< M, E2, S > &s) |
template<class E1 , int M, class E2 , int S> | |
Vector_< typename Vec< M, E2, S >::template Result< E1 >::Mul > | SimTK::operator* (const Vec< M, E2, S > &s, const VectorBase< E1 > &v) |
template<class E1 , int N, class E2 , int S> | |
Vector_< typename CNT< E1 >::template Result< Row< N, E2, S > >::Mul > | SimTK::operator* (const VectorBase< E1 > &v, const Row< N, E2, S > &s) |
template<class E1 , int N, class E2 , int S> | |
Vector_< typename Row< N, E2, S >::template Result< E1 >::Mul > | SimTK::operator* (const Row< N, E2, S > &s, const VectorBase< E1 > &v) |
template<class E1 , int M, int N, class E2 , int S1, int S2> | |
Vector_< typename CNT< E1 >::template Result< Mat< M, N, E2, S1, S2 > >::Mul > | SimTK::operator* (const VectorBase< E1 > &v, const Mat< M, N, E2, S1, S2 > &s) |
template<class E1 , int M, int N, class E2 , int S1, int S2> | |
Vector_< typename Mat< M, N, E2, S1, S2 >::template Result< E1 >::Mul > | SimTK::operator* (const Mat< M, N, E2, S1, S2 > &s, const VectorBase< E1 > &v) |
template<class E1 , int M, class E2 , int S> | |
Vector_< typename CNT< E1 >::template Result< SymMat< M, E2, S > >::Mul > | SimTK::operator* (const VectorBase< E1 > &v, const SymMat< M, E2, S > &s) |
template<class E1 , int M, class E2 , int S> | |
Vector_< typename SymMat< M, E2, S >::template Result< E1 >::Mul > | SimTK::operator* (const SymMat< M, E2, S > &s, const VectorBase< E1 > &v) |
Global operators involving RowVector objects | |
These operators take RowVectorBase arguments and produce RowVector_ results. | |
template<class E1 , class E2 > | |
RowVector_< typename CNT< E1 >::template Result< E2 >::Add > | SimTK::operator+ (const RowVectorBase< E1 > &l, const RowVectorBase< E2 > &r) |
template<class E > | |
RowVector_< E > | SimTK::operator+ (const RowVectorBase< E > &l, const typename CNT< E >::T &r) |
template<class E > | |
RowVector_< E > | SimTK::operator+ (const typename CNT< E >::T &l, const RowVectorBase< E > &r) |
template<class E1 , class E2 > | |
RowVector_< typename CNT< E1 >::template Result< E2 >::Sub > | SimTK::operator- (const RowVectorBase< E1 > &l, const RowVectorBase< E2 > &r) |
template<class E > | |
RowVector_< E > | SimTK::operator- (const RowVectorBase< E > &l, const typename CNT< E >::T &r) |
template<class E > | |
RowVector_< E > | SimTK::operator- (const typename CNT< E >::T &l, const RowVectorBase< E > &r) |
template<class E > | |
RowVector_< E > | SimTK::operator* (const RowVectorBase< E > &l, const typename CNT< E >::StdNumber &r) |
template<class E > | |
RowVector_< E > | SimTK::operator* (const typename CNT< E >::StdNumber &l, const RowVectorBase< E > &r) |
template<class E > | |
RowVector_< E > | SimTK::operator/ (const RowVectorBase< E > &l, const typename CNT< E >::StdNumber &r) |
template<class E > | |
RowVector_< E > | SimTK::operator* (const RowVectorBase< E > &l, int r) |
template<class E > | |
RowVector_< E > | SimTK::operator* (int l, const RowVectorBase< E > &r) |
template<class E > | |
RowVector_< E > | SimTK::operator/ (const RowVectorBase< E > &l, int r) |
template<class E1 , int M, class E2 , int S> | |
RowVector_< typename CNT< E1 >::template Result< Vec< M, E2, S > >::Mul > | SimTK::operator* (const RowVectorBase< E1 > &v, const Vec< M, E2, S > &s) |
template<class E1 , int M, class E2 , int S> | |
RowVector_< typename Vec< M, E2, S >::template Result< E1 >::Mul > | SimTK::operator* (const Vec< M, E2, S > &s, const RowVectorBase< E1 > &v) |
template<class E1 , int N, class E2 , int S> | |
RowVector_< typename CNT< E1 >::template Result< Row< N, E2, S > >::Mul > | SimTK::operator* (const RowVectorBase< E1 > &v, const Row< N, E2, S > &s) |
template<class E1 , int N, class E2 , int S> | |
RowVector_< typename Row< N, E2, S >::template Result< E1 >::Mul > | SimTK::operator* (const Row< N, E2, S > &s, const RowVectorBase< E1 > &v) |
template<class E1 , int M, int N, class E2 , int S1, int S2> | |
RowVector_< typename CNT< E1 >::template Result< Mat< M, N, E2, S1, S2 > >::Mul > | SimTK::operator* (const RowVectorBase< E1 > &v, const Mat< M, N, E2, S1, S2 > &s) |
template<class E1 , int M, int N, class E2 , int S1, int S2> | |
RowVector_< typename Mat< M, N, E2, S1, S2 >::template Result< E1 >::Mul > | SimTK::operator* (const Mat< M, N, E2, S1, S2 > &s, const RowVectorBase< E1 > &v) |
template<class E1 , int M, class E2 , int S> | |
RowVector_< typename CNT< E1 >::template Result< SymMat< M, E2, S > >::Mul > | SimTK::operator* (const RowVectorBase< E1 > &v, const SymMat< M, E2, S > &s) |
template<class E1 , int M, class E2 , int S> | |
RowVector_< typename SymMat< M, E2, S >::template Result< E1 >::Mul > | SimTK::operator* (const SymMat< M, E2, S > &s, const RowVectorBase< E1 > &v) |
Global operators involving mixed matrix, vector, and row vector objects | |
These operators take MatrixBase, VectorBase, and RowVectorBase arguments and produce Matrix_, Vector_, and RowVector_ results. | |
template<class E1 , class E2 > | |
CNT< E1 >::template Result< E2 >::Mul | SimTK::operator* (const RowVectorBase< E1 > &r, const VectorBase< E2 > &v) |
template<class E1 , class E2 > | |
Vector_< typename CNT< E1 >::template Result< E2 >::Mul > | SimTK::operator* (const MatrixBase< E1 > &m, const VectorBase< E2 > &v) |
template<class E1 , class E2 > | |
Matrix_< typename CNT< E1 >::template Result< E2 >::Mul > | SimTK::operator* (const MatrixBase< E1 > &m1, const MatrixBase< E2 > &m2) |
This file defines the client side of the SimTK::Matrix classes, which hold medium to large, variable-sized matrices whose elements are packed SimTK "Composite Numerical Types" (CNTs).
Unlike CNTs, the implemention here is opaque, and almost all properties are captured in the implementation at run time rather than in the type at compile time.
Every Matrix consists logically of three pieces:
They are organized like this:
------------ ------------ | Handle<E> | -------> | | ------------ <------- | Helper<S> | | | | | --------~ ~-- | | ------> | Data<S> ... | ------------ --------~ ~--
The handle is the object actually appearing in SimTK API user programs. It always consists of just a single pointer, pointing to a library-side "helper" object whose implementation is opaque. The handle is templatized by the user's element type, which may be any packed composite numerical type, including scalar types like float
and complex<double>
, but also composite types such as Vec3
or Mat<2
,2,Mat<3,3>>. A Matrix handle owns the helper to which it points and must destruct the helper when the handle's destructor is called.
The helper, on the other hand, is parameterized only by the underlying scalar type. There are exactly 12 SimTK scalar types, so all can be instantiated on the library side leaving the implementation opaque and thus flexible from release to release without compromising binary compatibility. (The scalar types are: the four C++ standard types float and double, complex<float>, and complex<double>; the SimTK numbers conjugate<float> and conjugate<double>; and negator<> types templatized by any of the six numeric types.) The helper contains several kinds of information:
The data itself consists only of scalars S of the same type as the helper's template argument, but different helpers can look at the same data differently. For examples, when the elements are composite consisting of k scalars, the helper will provide a view of the data in which its scalars are interpreted in groups of k. Many other reinterpretations of the data are possible and useful, such as a real-valued helper viewing only the real or imaginary part of complex data, or a helper which views the data order as though it were transposed.
At most one matrix helper owns the matrix data and is responsible for deleting that data when no longer needed. That is called an "owner" helper and its associated handle is an owner handle. Normally the owner is the handle (and helper) that allocated the data, and in most cases an owner can resize the data at will. Many other handles may reference the same data; those non-owner handles are called "views". Every view may present a different picture of the underlying data. The default view is "whole" meaning that all the elements of the data are visible, and appear in their normal order. A "transpose" view also shows all the elements but the matrix dimensions and indices are reversed. Other common views are "block" to select a sub-block of a matrix, and "diagonal" which shows only the diagonal of a matrix (as a vector).
NOTE: Destruction of an owner destructs the data it owns *regardless* of the presence of other views into that data! I.e., these are not reference counted. TODO: should we change that?
In some cases there may be no owner helper for a particular piece of matrix data. That occurs when pre-existing memory, such as a Fortran array, is used to construct a Matrix. In that case all the helpers are views and the data will persist after the destruction of the last referencing helper.
A Matrix that is the owner of its data will be resized whenever necessary, unless you take active steps to prevent that. For example, if you declare a Vector, the number of rows can resize but the number of columns will be locked at 1. A RowVector does the reverse. You can also explicitly lock the number of rows and/or columns of a matrix to prevent unwanted resizes.
Here are the classes and short descriptions:
MatrixHelper<S> interface to the opaque implementation, templatized by scalar type only MatrixBase<CNT> fully templatized client, contains a MatrixHelper
The rest are dataless classes all of which can be interconverted just by recasting. Every one of these classes has a default conversion to type Matrix_<same element type>, so users can write functions that expect a Matrix argument and pass it a Vector, RowVectorView, or whatever.
VectorBase<CNT> these are derived from MatrixBase and add no new data, RowVectorBase<CNT> but change some of the operators and other methods to be appropriate for 1d data.
Matrix_<CNT> 2d owner class (a MatrixBase<CNT>) Vector_<CNT> column owner class (a VectorBase<CNT>) RowVector_<CNT> row owner class (a RowVectorBase<CNT>)
Views are exactly the same as the corresponding owner class, but with shallow construction and assignment semantics.
MatrixView_<CNT>, VectorView_<CNT>, RowVectorView_<CNT>