Simbody
3.3
|
RS is total spacing between rows in memory (default 1) More...
#include <SymMat.h>
Classes | |
struct | EltResult |
struct | Result |
struct | Substitute |
Public Types | |
enum | { NRows = M, NCols = M, NDiagElements = M, NLowerElements = (M*(M-1))/2, NPackedElements = NDiagElements+NLowerElements, NActualElements = RS * NPackedElements, NActualScalars = CNT<E>::NActualScalars * NActualElements, RowSpacing = RS, ColSpacing = NActualElements, ImagOffset = NTraits<ENumber>::ImagOffset, RealStrideFactor = 1, ArgDepth, IsScalar = 0, IsULessScalar = 0, IsNumber = 0, IsStdNumber = 0, IsPrecision = 0, SignInterpretation = CNT<E>::SignInterpretation } |
typedef SymMat< M, E, RS > | T |
typedef SymMat< M, ENeg, RS > | TNeg |
typedef SymMat< M, EWithoutNegator, RS > | TWithoutNegator |
typedef SymMat< M, EReal, RS *CNT< E >::RealStrideFactor > | TReal |
typedef SymMat< M, EImag, RS *CNT< E >::RealStrideFactor > | TImag |
typedef SymMat< M, EComplex, RS > | TComplex |
typedef T | THerm |
typedef SymMat< M, EHerm, RS > | TPosTrans |
typedef E | TElement |
typedef Vec< M, E, RS > | TDiag |
typedef Vec<(M *(M-1))/2, E, RS > | TLower |
typedef Vec<(M *(M-1))/2, EHerm, RS > | TUpper |
typedef Vec<(M *(M+1))/2, E, RS > | TAsVec |
typedef Row< M, E, 1 > | TRow |
typedef Vec< M, E, 1 > | TCol |
typedef SymMat< M, ESqrt, 1 > | TSqrt |
typedef SymMat< M, EAbs, 1 > | TAbs |
typedef SymMat< M, EStandard, 1 > | TStandard |
typedef SymMat< M, EInvert, 1 > | TInvert |
typedef SymMat< M, ENormalize, 1 > | TNormalize |
typedef SymMat< M, ESqHermT, 1 > | TSqHermT |
typedef SymMat< M, ESqTHerm, 1 > | TSqTHerm |
typedef SymMat< M, E, 1 > | TPacked |
typedef EScalar | Scalar |
typedef EULessScalar | ULessScalar |
typedef ENumber | Number |
typedef EStdNumber | StdNumber |
typedef EPrecision | Precision |
typedef EScalarNormSq | ScalarNormSq |
Public Member Functions | |
ScalarNormSq | scalarNormSqr () const |
TSqrt | sqrt () const |
TAbs | abs () const |
TStandard | standardize () const |
EStandard | trace () const |
SymMat () | |
Default construction initializes to NaN when debugging but is left uninitialized otherwise. More... | |
SymMat (const SymMat &src) | |
Copy constructor. More... | |
SymMat & | operator= (const SymMat &src) |
Copy assignment; no harm if source and this are the same matrix. More... | |
template<class EE , int CSS, int RSS> | |
SymMat (const Mat< M, M, EE, CSS, RSS > &m) | |
This is an explicit conversion from square Mat of right size, assuming that the source matrix is symmetric to within a reasonable numerical tolerance. More... | |
template<class EE , int CSS, int RSS> | |
SymMat & | setFromLower (const Mat< M, M, EE, CSS, RSS > &m) |
Create a new SymMat of this type from a square Mat of the right size, looking only at lower elements and the real part of the diagonal. More... | |
template<class EE , int CSS, int RSS> | |
SymMat & | setFromUpper (const Mat< M, M, EE, CSS, RSS > &m) |
Create a new SymMat of this type from a square Mat of the right size, looking only at upper elements and the real part of the diagonal. More... | |
template<class EE , int CSS, int RSS> | |
SymMat & | setFromSymmetric (const Mat< M, M, EE, CSS, RSS > &m) |
Create a new SymMat of this type from a square Mat of the right size, that is expected to be symmetric (hermitian) to within a tolerance. More... | |
template<int RSS> | |
SymMat (const SymMat< M, E, RSS > &src) | |
This is an implicit conversion from a SymMat of the same length and element type but with different spacing. More... | |
template<int RSS> | |
SymMat (const SymMat< M, ENeg, RSS > &src) | |
This is an implicit conversion from a SymMat of the same length and negated element type, possibly with different spacing. More... | |
template<class EE , int RSS> | |
SymMat (const SymMat< M, EE, RSS > &src) | |
Construct a SymMat from a SymMat of the same dimensions, with any element type and spacing. More... | |
SymMat (const E &e) | |
SymMat (const ENeg &e) | |
SymMat (int i) | |
SymMat (const E &e0, const E &e1, const E &e2) | |
A bevy of constructors from individual exact-match elements IN ROW ORDER, giving the LOWER TRIANGLE, like this: More... | |
SymMat (const E &e0, const E &e1, const E &e2, const E &e3, const E &e4, const E &e5) | |
SymMat (const E &e0, const E &e1, const E &e2, const E &e3, const E &e4, const E &e5, const E &e6, const E &e7, const E &e8, const E &e9) | |
SymMat (const E &e0, const E &e1, const E &e2, const E &e3, const E &e4, const E &e5, const E &e6, const E &e7, const E &e8, const E &e9, const E &e10, const E &e11, const E &e12, const E &e13, const E &e14) | |
SymMat (const E &e0, const E &e1, const E &e2, const E &e3, const E &e4, const E &e5, const E &e6, const E &e7, const E &e8, const E &e9, const E &e10, const E &e11, const E &e12, const E &e13, const E &e14, const E &e15, const E &e16, const E &e17, const E &e18, const E &e19, const E &e20) | |
template<class EE > | |
SymMat (const EE *p) | |
template<class EE > | |
SymMat & | operator= (const EE *p) |
template<class EE , int RSS> | |
SymMat & | operator= (const SymMat< M, EE, RSS > &mm) |
template<class EE , int RSS> | |
SymMat & | operator+= (const SymMat< M, EE, RSS > &mm) |
template<class EE , int RSS> | |
SymMat & | operator+= (const SymMat< M, negator< EE >, RSS > &mm) |
template<class EE , int RSS> | |
SymMat & | operator-= (const SymMat< M, EE, RSS > &mm) |
template<class EE , int RSS> | |
SymMat & | operator-= (const SymMat< M, negator< EE >, RSS > &mm) |
template<class EE , int RSS> | |
SymMat & | operator*= (const SymMat< M, EE, RSS > &mm) |
template<class E2 , int RS2> | |
Result< SymMat< M, E2, RS2 > >::Add | conformingAdd (const SymMat< M, E2, RS2 > &r) const |
template<class E2 , int RS2> | |
Result< SymMat< M, E2, RS2 > >::Sub | conformingSubtract (const SymMat< M, E2, RS2 > &r) const |
template<class E2 , int RS2> | |
Result< SymMat< M, E2, RS2 > >::Mul | conformingMultiply (const SymMat< M, E2, RS2 > &s) const |
template<class E2 , int RS2> | |
EltResult< E2 >::Mul | elementwiseMultiply (const SymMat< M, E2, RS2 > &r) const |
template<class E2 , int RS2> | |
EltResult< E2 >::Dvd | elementwiseDivide (const SymMat< M, E2, RS2 > &r) const |
const E & | operator() (int i, int j) const |
E & | operator() (int i, int j) |
TRow | operator[] (int i) const |
TCol | operator() (int j) const |
ScalarNormSq | normSqr () const |
CNT< ScalarNormSq >::TSqrt | norm () const |
TNormalize | normalize () const |
There is no conventional meaning for normalize() applied to a matrix. More... | |
TInvert | invert () const |
const SymMat & | operator+ () const |
const TNeg & | operator- () const |
TNeg & | operator- () |
const THerm & | operator~ () const |
THerm & | operator~ () |
const TNeg & | negate () const |
TNeg & | updNegate () |
const THerm & | transpose () const |
THerm & | updTranspose () |
const TPosTrans & | positionalTranspose () const |
TPosTrans & | updPositionalTranspose () |
const TReal & | real () const |
TReal & | real () |
const TImag & | imag () const |
TImag & | imag () |
const TWithoutNegator & | castAwayNegatorIfAny () const |
TWithoutNegator & | updCastAwayNegatorIfAny () |
template<class EE > | |
SymMat< M, typename CNT< E > ::template Result< EE >::Mul > | scalarMultiply (const EE &e) const |
template<class EE > | |
SymMat< M, typename CNT< EE > ::template Result< E >::Mul > | scalarMultiplyFromLeft (const EE &e) const |
template<class EE > | |
SymMat< M, typename CNT< E > ::template Result< EE >::Dvd > | scalarDivide (const EE &e) const |
template<class EE > | |
SymMat< M, typename CNT< EE > ::template Result< E >::Dvd > | scalarDivideFromLeft (const EE &e) const |
template<class EE > | |
SymMat< M, typename CNT< E > ::template Result< EE >::Add > | scalarAdd (const EE &e) const |
template<class EE > | |
SymMat< M, typename CNT< E > ::template Result< EE >::Sub > | scalarSubtract (const EE &e) const |
template<class EE > | |
SymMat< M, typename CNT< EE > ::template Result< E >::Sub > | scalarSubtractFromLeft (const EE &e) const |
template<class EE > | |
SymMat & | operator= (const EE &e) |
template<class EE > | |
SymMat & | operator+= (const EE &e) |
template<class EE > | |
SymMat & | operator-= (const EE &e) |
template<class EE > | |
SymMat & | operator*= (const EE &e) |
template<class EE > | |
SymMat & | operator/= (const EE &e) |
template<class EE > | |
SymMat & | scalarEq (const EE &ee) |
template<class EE > | |
SymMat & | scalarPlusEq (const EE &ee) |
template<class EE > | |
SymMat & | scalarMinusEq (const EE &ee) |
template<class EE > | |
SymMat & | scalarMinusEqFromLeft (const EE &ee) |
template<class EE > | |
SymMat & | scalarTimesEq (const EE &ee) |
template<class EE > | |
SymMat & | scalarTimesEqFromLeft (const EE &ee) |
template<class EE > | |
SymMat & | scalarDivideEq (const EE &ee) |
template<class EE > | |
SymMat & | scalarDivideEqFromLeft (const EE &ee) |
void | setToNaN () |
void | setToZero () |
bool | isNaN () const |
Return true if any element of this SymMat contains a NaN anywhere. More... | |
bool | isInf () const |
Return true if any element of this SymMat contains a +Inf or -Inf somewhere but no element contains a NaN anywhere. More... | |
bool | isFinite () const |
Return true if no element contains an Infinity or a NaN. More... | |
template<class E2 , int RS2> | |
bool | isNumericallyEqual (const SymMat< M, E2, RS2 > &m, double tol) const |
Test whether this matrix is numerically equal to some other matrix with the same shape, using a specified tolerance. More... | |
template<class E2 , int RS2> | |
bool | isNumericallyEqual (const SymMat< M, E2, RS2 > &m) const |
Test whether this matrix is numerically equal to some other matrix with the same shape, using a default tolerance which is the looser of the default tolerances of the two objects being compared. More... | |
bool | isNumericallyEqual (const ELT &e, double tol=getDefaultTolerance()) const |
Test whether this is numerically a "scalar" matrix, meaning that it is a diagonal matrix in which each diagonal element is numerically equal to the same scalar, using either a specified tolerance or the matrix's default tolerance (which is always the same or looser than the default tolerance for one of its elements). More... | |
TRow | row (int i) const |
TCol | col (int j) const |
E | elt (int i, int j) const |
Return a value for any element of a symmetric matrix, even those in the upper triangle which aren't actually stored anywhere. More... | |
const TDiag & | getDiag () const |
TDiag & | updDiag () |
const TDiag & | diag () const |
TDiag & | diag () |
const TLower & | getLower () const |
TLower & | updLower () |
const TUpper & | getUpper () const |
TUpper & | updUpper () |
const TAsVec & | getAsVec () const |
TAsVec & | updAsVec () |
const E & | getEltDiag (int i) const |
E & | updEltDiag (int i) |
const E & | getEltLower (int i, int j) const |
E & | updEltLower (int i, int j) |
const EHerm & | getEltUpper (int i, int j) const |
EHerm & | updEltUpper (int i, int j) |
TRow | colSum () const |
Returns a row vector (Row) containing the column sums of this matrix. More... | |
TRow | sum () const |
This is an alternate name for colSum(); behaves like the Matlab function of the same name. More... | |
TCol | rowSum () const |
Returns a column vector (Vec) containing the row sums of this matrix. More... | |
Static Public Member Functions | |
static int | size () |
static int | nrow () |
static int | ncol () |
static const SymMat & | getAs (const ELT *p) |
static SymMat & | updAs (ELT *p) |
static TPacked | getNaN () |
static double | getDefaultTolerance () |
For approximate comparisions, the default tolerance to use for a matrix is its shortest dimension times its elements' default tolerance. More... | |
Friends | |
template<int MM, class EE , int RSS> | |
class | SymMat |
Related Functions | |
(Note that these are not member functions.) | |
template<int M, class E , int RS> | |
void | writeUnformatted (std::ostream &o, const SymMat< M, E, RS > &v) |
Specialize for SymMat<M,E,RS> delegating to Row<M,E,RS> with newlines separating the rows, but no final newline. More... | |
template<int M, class E , int RS> | |
bool | readUnformatted (std::istream &in, SymMat< M, E, RS > &v) |
Specialize for SymMat<M,E,RS>. More... | |
RS is total spacing between rows in memory (default 1)
typedef SymMat<M,E,RS> SimTK::SymMat< M, ELT, RS >::T |
typedef SymMat<M,ENeg,RS> SimTK::SymMat< M, ELT, RS >::TNeg |
typedef SymMat<M,EWithoutNegator,RS> SimTK::SymMat< M, ELT, RS >::TWithoutNegator |
typedef SymMat<M,EReal,RS*CNT<E>::RealStrideFactor> SimTK::SymMat< M, ELT, RS >::TReal |
typedef SymMat<M,EImag,RS*CNT<E>::RealStrideFactor> SimTK::SymMat< M, ELT, RS >::TImag |
typedef SymMat<M,EComplex,RS> SimTK::SymMat< M, ELT, RS >::TComplex |
typedef T SimTK::SymMat< M, ELT, RS >::THerm |
typedef SymMat<M,EHerm,RS> SimTK::SymMat< M, ELT, RS >::TPosTrans |
typedef E SimTK::SymMat< M, ELT, RS >::TElement |
typedef Vec<M,E,RS> SimTK::SymMat< M, ELT, RS >::TDiag |
typedef Vec<(M*(M-1))/2,E,RS> SimTK::SymMat< M, ELT, RS >::TLower |
typedef Vec<(M*(M-1))/2,EHerm,RS> SimTK::SymMat< M, ELT, RS >::TUpper |
typedef Vec<(M*(M+1))/2,E,RS> SimTK::SymMat< M, ELT, RS >::TAsVec |
typedef Row<M,E,1> SimTK::SymMat< M, ELT, RS >::TRow |
typedef Vec<M,E,1> SimTK::SymMat< M, ELT, RS >::TCol |
typedef SymMat<M,ESqrt,1> SimTK::SymMat< M, ELT, RS >::TSqrt |
typedef SymMat<M,EAbs,1> SimTK::SymMat< M, ELT, RS >::TAbs |
typedef SymMat<M,EStandard,1> SimTK::SymMat< M, ELT, RS >::TStandard |
typedef SymMat<M,EInvert,1> SimTK::SymMat< M, ELT, RS >::TInvert |
typedef SymMat<M,ENormalize,1> SimTK::SymMat< M, ELT, RS >::TNormalize |
typedef SymMat<M,ESqHermT,1> SimTK::SymMat< M, ELT, RS >::TSqHermT |
typedef SymMat<M,ESqTHerm,1> SimTK::SymMat< M, ELT, RS >::TSqTHerm |
typedef SymMat<M,E,1> SimTK::SymMat< M, ELT, RS >::TPacked |
typedef EScalar SimTK::SymMat< M, ELT, RS >::Scalar |
typedef EULessScalar SimTK::SymMat< M, ELT, RS >::ULessScalar |
typedef ENumber SimTK::SymMat< M, ELT, RS >::Number |
typedef EStdNumber SimTK::SymMat< M, ELT, RS >::StdNumber |
typedef EPrecision SimTK::SymMat< M, ELT, RS >::Precision |
typedef EScalarNormSq SimTK::SymMat< M, ELT, RS >::ScalarNormSq |
anonymous enum |
|
inline |
Default construction initializes to NaN when debugging but is left uninitialized otherwise.
|
inline |
Copy constructor.
|
inlineexplicit |
This is an explicit conversion from square Mat of right size, assuming that the source matrix is symmetric to within a reasonable numerical tolerance.
In Debug mode we'll test that assumption and throw an exception if it is wrong. In Release mode you're on your own. All the elements of the source Mat are used; off-diagonal elements (i,j) are averaged with their corresponding element (j,i); the imaginary part of the diagonal is set exactly to zero. If you don't want to spend the flops to average the off-diagonals, and you're sure the source is symmetric, use either setFromLower() or setFromUpper() which will just copy the elements.
|
inline |
This is an implicit conversion from a SymMat of the same length and element type but with different spacing.
|
inline |
This is an implicit conversion from a SymMat of the same length and negated element type, possibly with different spacing.
|
inlineexplicit |
|
inlineexplicit |
|
inlineexplicit |
|
inlineexplicit |
|
inline |
A bevy of constructors from individual exact-match elements IN ROW ORDER, giving the LOWER TRIANGLE, like this:
a b c d e f g h i j
Note that this will be mapped to our diagonal/lower layout, which in the above example would be:
[a c f j][b d g e h i]
|
inline |
|
inline |
|
inline |
|
inline |
|
inlineexplicit |
|
inlinestatic |
|
inlinestatic |
|
inlinestatic |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
Copy assignment; no harm if source and this are the same matrix.
|
inline |
|
inline |
Create a new SymMat of this type from a square Mat of the right size, looking only at upper elements and the real part of the diagonal.
Note that the SymMat's stored elements are still in its lower triangle; they are just initialized from the Mat's upper triangle. There is no transposing of elements here; we simply copy the upper elements of the Mat to the corresponding lower elements of the SymMat.
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
There is no conventional meaning for normalize() applied to a matrix.
We choose to define it as follows: If the elements of this SymMat are scalars, the result is what you get by dividing each element by the Frobenius norm() calculated above. If the elements are *not* scalars, then the elements are *separately* normalized.
Normalize returns a matrix of the same dimension but in new, packed storage and with a return type that does not include negator<> even if the original SymMat<> does, because we can eliminate the negation here almost for free. But we can't standardize (change conjugate to complex) for free, so we'll retain conjugates if there are any.
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inlinestatic |
|
inlinestatic |
|
inlinestatic |
|
inline |
Return true if any element of this SymMat contains a NaN anywhere.
|
inline |
Return true if any element of this SymMat contains a +Inf or -Inf somewhere but no element contains a NaN anywhere.
|
inline |
Return true if no element contains an Infinity or a NaN.
|
inlinestatic |
For approximate comparisions, the default tolerance to use for a matrix is its shortest dimension times its elements' default tolerance.
|
inline |
Test whether this matrix is numerically equal to some other matrix with the same shape, using a specified tolerance.
|
inline |
Test whether this matrix is numerically equal to some other matrix with the same shape, using a default tolerance which is the looser of the default tolerances of the two objects being compared.
|
inline |
Test whether this is numerically a "scalar" matrix, meaning that it is a diagonal matrix in which each diagonal element is numerically equal to the same scalar, using either a specified tolerance or the matrix's default tolerance (which is always the same or looser than the default tolerance for one of its elements).
|
inline |
|
inline |
|
inline |
Return a value for any element of a symmetric matrix, even those in the upper triangle which aren't actually stored anywhere.
For elements whose underlying numeric types are complex, this will require computation in order to return the conjugates. So we always have to copy out the element, and may also have to conjugate it (one flop per complex number).
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
Returns a row vector (Row) containing the column sums of this matrix.
|
inline |
This is an alternate name for colSum(); behaves like the Matlab function of the same name.
|
inline |
Returns a column vector (Vec) containing the row sums of this matrix.
This will be the conjugate transpose of the column sums.