diff --git a/math/matrix/inc/LinkDef.h b/math/matrix/inc/LinkDef.h index 3fc07289cf2ce518bae3055c077b8aed2b7f727e..157399ca62a054018b0f6bf6cc9526049ff3aefe 100644 --- a/math/matrix/inc/LinkDef.h +++ b/math/matrix/inc/LinkDef.h @@ -44,7 +44,7 @@ #pragma link C++ class TMatrixTBase <float>-; #pragma link C++ class TMatrixT <float>-; #pragma link C++ class TMatrixTSym <float>-; -#pragma link C++ class TMatrixTSparse <float>+; +#pragma link C++ class TMatrixTSparse <float>-; #pragma link C++ class TMatrixTLazy <float>+; #pragma link C++ class TMatrixTSymLazy <float>+; @@ -102,7 +102,7 @@ #pragma link C++ class TMatrixTBase <double>-; #pragma link C++ class TMatrixT <double>-; #pragma link C++ class TMatrixTSym <double>-; -#pragma link C++ class TMatrixTSparse <double>+; +#pragma link C++ class TMatrixTSparse <double>-; #pragma link C++ class TMatrixTLazy <double>+; #pragma link C++ class TMatrixTSymLazy <double>+; @@ -175,7 +175,10 @@ #pragma link C++ function operator* (const TMatrixFSym &,const TVectorF &); #pragma link C++ function operator* (const TMatrixFSparse &,const TVectorF &); #pragma link C++ function operator* ( Float_t ,const TVectorF &); -#pragma link C++ function Dot (const TVectorF &,const TVectorF &) +#pragma link C++ function Dot (const TVectorF &,const TVectorF &); +#pragma link C++ function OuterProduct (const TVectorF &,const TVectorF &); +#pragma link C++ function OuterProduct ( TMatrixF &,const TVectorF &,const TVectorF &); +#pragma link C++ function Mult (const TVectorF &,const TMatrixF &,const TVectorF &); #pragma link C++ function Add ( TVectorF &, Float_t ,const TVectorF &); #pragma link C++ function Add ( TVectorF &, Float_t ,const TMatrixF &,const TVectorF &); #pragma link C++ function Add ( TVectorF &, Float_t ,const TMatrixFSym &,const TVectorF &); @@ -192,6 +195,9 @@ #pragma link C++ function ElementDiv ( TVectorF &,const TVectorF &,const TVectorF &); #pragma link C++ function AreCompatible (const TVectorF &,const TVectorF &, Int_t); #pragma link C++ function AreCompatible (const TVectorF &,const TVectorD &, Int_t); +#pragma link C++ function AreCompatible (const TMatrixF &,const TVectorF &, Int_t); +#pragma link C++ function AreCompatible (const TVectorF &,const TMatrixF &, Int_t); + #pragma link C++ function Compare (const TVectorF &,const TVectorF &); #pragma link C++ function VerifyVectorValue (const TVectorF &, Float_t , Int_t, Float_t); #pragma link C++ function VerifyVectorIdentity(const TVectorF &,const TVectorF &, Int_t, Float_t); @@ -303,7 +309,10 @@ #pragma link C++ function operator* (const TMatrixDSym &,const TVectorD &); #pragma link C++ function operator* (const TMatrixDSparse &,const TVectorD &); #pragma link C++ function operator* ( Double_t ,const TVectorD &); -#pragma link C++ function Dot (const TVectorD &,const TVectorD &) +#pragma link C++ function Dot (const TVectorD &,const TVectorD &); +#pragma link C++ function OuterProduct (const TVectorD &,const TVectorD &); +#pragma link C++ function OuterProduct ( TMatrixD &,const TVectorD &,const TVectorD &); +#pragma link C++ function Mult (const TVectorD &,const TMatrixD &,const TVectorD &); #pragma link C++ function Add ( TVectorD &, Double_t ,const TVectorD &); #pragma link C++ function Add ( TVectorD &, Double_t ,const TMatrixD &,const TVectorD &); #pragma link C++ function Add ( TVectorD &, Double_t ,const TMatrixDSym &,const TVectorD &); @@ -320,6 +329,8 @@ #pragma link C++ function ElementDiv ( TVectorD &,const TVectorD &,const TVectorD &); #pragma link C++ function AreCompatible (const TVectorD &,const TVectorD &, Int_t); #pragma link C++ function AreCompatible (const TVectorD &,const TVectorF &, Int_t); +#pragma link C++ function AreCompatible (const TMatrixD &,const TVectorD &, Int_t); +#pragma link C++ function AreCompatible (const TVectorD &,const TMatrixD &, Int_t); #pragma link C++ function Compare (const TVectorD &,const TVectorD &); #pragma link C++ function VerifyVectorValue (const TVectorD &, Double_t , Int_t, Double_t); #pragma link C++ function VerifyVectorIdentity(const TVectorD &,const TVectorD &, Int_t, Double_t); diff --git a/math/matrix/inc/TVectorT.h b/math/matrix/inc/TVectorT.h index f339d45968fd0f5930b1be2a93123b31a1519e7f..0cf08addd13242f37e02fcfbd1bf275a860e40a2 100644 --- a/math/matrix/inc/TVectorT.h +++ b/math/matrix/inc/TVectorT.h @@ -204,7 +204,7 @@ template<class Element> inline TVectorT<Element> TVectorT<Element>::GetSu return tmp; } -template<class Element> inline const Element &TVectorT<Element>::operator()(Int_t ind) const +template<class Element> inline const Element &TVectorT<Element>::operator()(Int_t ind) const { // Access a vector element. @@ -217,7 +217,7 @@ template<class Element> inline const Element &TVectorT<Element>::opera return fElements[aind]; } -template<class Element> inline Element &TVectorT<Element>::operator()(Int_t ind) +template<class Element> inline Element &TVectorT<Element>::operator()(Int_t ind) { // Access a vector element. @@ -230,53 +230,59 @@ template<class Element> inline Element &TVectorT<Element>::operator()( return fElements[aind]; } -template<class Element1,class Element2> - Bool_t AreCompatible(const TVectorT <Element1> &source1,const TVectorT <Element2> &source2, Int_t verbose=0); -template<class Element> Bool_t operator== (const TVectorT <Element> &source1,const TVectorT <Element> &source2); -template<class Element> TVectorT<Element> operator+ (const TVectorT <Element> &source1,const TVectorT <Element> &source2); -template<class Element> TVectorT<Element> operator- (const TVectorT <Element> &source1,const TVectorT <Element> &source2); -template<class Element> Element operator* (const TVectorT <Element> &source1,const TVectorT <Element> &source2); -template<class Element> TVectorT<Element> operator* (const TMatrixT <Element> &a, const TVectorT <Element> &source); -template<class Element> TVectorT<Element> operator* (const TMatrixTSym <Element> &a, const TVectorT <Element> &source); -template<class Element> TVectorT<Element> operator* (const TMatrixTSparse<Element> &a, const TVectorT <Element> &source); -template<class Element> TVectorT<Element> operator* ( Element val, const TVectorT <Element> &source); -template<class Element> Element Dot (const TVectorT <Element> &source1,const TVectorT <Element> &source2); -template<class Element> TVectorT<Element> &Add ( TVectorT <Element> &target, Element scalar, const TVectorT<Element> &source); -template<class Element> TVectorT<Element> &Add ( TVectorT <Element> &target, Element , const TMatrixT <Element> &a, + +template<class Element> Bool_t operator== (const TVectorT <Element> &source1,const TVectorT <Element> &source2); +template<class Element> TVectorT<Element> operator+ (const TVectorT <Element> &source1,const TVectorT <Element> &source2); +template<class Element> TVectorT<Element> operator- (const TVectorT <Element> &source1,const TVectorT <Element> &source2); +template<class Element> Element operator* (const TVectorT <Element> &source1,const TVectorT <Element> &source2); +template<class Element> TVectorT<Element> operator* (const TMatrixT <Element> &a, const TVectorT <Element> &source); +template<class Element> TVectorT<Element> operator* (const TMatrixTSym <Element> &a, const TVectorT <Element> &source); +template<class Element> TVectorT<Element> operator* (const TMatrixTSparse<Element> &a, const TVectorT <Element> &source); +template<class Element> TVectorT<Element> operator* ( Element val, const TVectorT <Element> &source); + +template<class Element> Element Dot (const TVectorT <Element> &source1,const TVectorT <Element> &source2); +template <class Element1,class Element2> + TMatrixT<Element1> OuterProduct(const TVectorT <Element1> &v1, const TVectorT <Element2> &v2); +template <class Element1,class Element2,class Element3> + TMatrixT<Element1> &OuterProduct( TMatrixT <Element1> &target, const TVectorT <Element2> &v1, const TVectorT <Element3> &v2); +template <class Element1,class Element2,class Element3> + Element1 Mult (const TVectorT <Element1> &v1, const TMatrixT <Element2> &m, const TVectorT <Element3> &v2); + +template<class Element> TVectorT<Element> &Add ( TVectorT <Element> &target, Element scalar, const TVectorT <Element> &source); +template<class Element> TVectorT<Element> &Add ( TVectorT <Element> &target, Element scalar, const TMatrixT <Element> &a, const TVectorT<Element> &source); -template<class Element> TVectorT<Element> &Add ( TVectorT <Element> &target, Element , const TMatrixTSym <Element> &a, +template<class Element> TVectorT<Element> &Add ( TVectorT <Element> &target, Element scalar, const TMatrixTSym <Element> &a, const TVectorT<Element> &source); -template<class Element> TVectorT<Element> &Add ( TVectorT <Element> &target, Element , const TMatrixTSparse<Element> &a, +template<class Element> TVectorT<Element> &Add ( TVectorT <Element> &target, Element scalar, const TMatrixTSparse<Element> &a, const TVectorT<Element> &source); -template<class Element> TVectorT<Element> &AddElemMult ( TVectorT <Element> &target, Element scalar, const TVectorT<Element> &source1, +template<class Element> TVectorT<Element> &AddElemMult ( TVectorT <Element> &target, Element scalar, const TVectorT <Element> &source1, const TVectorT <Element> &source2); -template<class Element> TVectorT<Element> &AddElemMult ( TVectorT <Element> &target, Element scalar, const TVectorT<Element> &source1, - const TVectorT <Element> &source2,const TVectorT <Element> &select); -template<class Element> TVectorT<Element> &AddElemDiv ( TVectorT <Element> &target, Element scalar, const TVectorT<Element> &source1, +template<class Element> TVectorT<Element> &AddElemMult ( TVectorT <Element> &target, Element scalar, const TVectorT <Element> &source1, + const TVectorT <Element> &source2,const TVectorT <Element> &select); +template<class Element> TVectorT<Element> &AddElemDiv ( TVectorT <Element> &target, Element scalar, const TVectorT <Element> &source1, const TVectorT <Element> &source2); -template<class Element> TVectorT<Element> &AddElemDiv ( TVectorT <Element> &target, Element scalar, const TVectorT<Element> &source1, - const TVectorT <Element> &source2,const TVectorT <Element> &select); -template<class Element> TVectorT<Element> &ElementMult ( TVectorT <Element> &target, const TVectorT <Element> &source); -template<class Element> TVectorT<Element> &ElementMult ( TVectorT <Element> &target, const TVectorT <Element> &source, const TVectorT<Element> &select); -template<class Element> TVectorT<Element> &ElementDiv ( TVectorT <Element> &target, const TVectorT <Element> &source); -template<class Element> TVectorT<Element> &ElementDiv ( TVectorT <Element> &target, const TVectorT <Element> &source, const TVectorT<Element> &select); -template<class Element> void Compare (const TVectorT <Element> &source1,const TVectorT <Element> &source2); -template<class Element> Bool_t VerifyVectorValue - (const TVectorT <Element> &m, Element val, Int_t verbose, - Element maxDevAllow); -template<class Element> Bool_t VerifyVectorValue - (const TVectorT <Element> &m, Element val, Int_t verbose) - { return VerifyVectorValue(m,val,verbose,Element(0.0)); } -template<class Element> Bool_t VerifyVectorValue - (const TVectorT <Element> &m, Element val) - { return VerifyVectorValue(m,val,1,Element(0.0)); } -template<class Element> Bool_t VerifyVectorIdentity - (const TVectorT <Element> &m1, const TVectorT <Element> &m2, Int_t verbose, - Element maxDevAllow); -template<class Element> Bool_t VerifyVectorIdentity - (const TVectorT <Element> &m1, const TVectorT <Element> &m2, Int_t verbose) - { return VerifyVectorIdentity(m1,m2,verbose,Element(0.0)); } -template<class Element> Bool_t VerifyVectorIdentity - (const TVectorT <Element> &m1, const TVectorT <Element> &m2) - { return VerifyVectorIdentity(m1,m2,1,Element(0.0)); } +template<class Element> TVectorT<Element> &AddElemDiv ( TVectorT <Element> &target, Element scalar, const TVectorT <Element> &source1, + const TVectorT <Element> &source2,const TVectorT <Element> &select); +template<class Element> TVectorT<Element> &ElementMult ( TVectorT <Element> &target, const TVectorT <Element> &source); +template<class Element> TVectorT<Element> &ElementMult ( TVectorT <Element> &target, const TVectorT <Element> &source, const TVectorT <Element> &select); +template<class Element> TVectorT<Element> &ElementDiv ( TVectorT <Element> &target, const TVectorT <Element> &source); +template<class Element> TVectorT<Element> &ElementDiv ( TVectorT <Element> &target, const TVectorT <Element> &source, const TVectorT <Element> &select); + +template<class Element1,class Element2> Bool_t AreCompatible(const TVectorT<Element1> &v1,const TVectorT<Element2> &v2,Int_t verbose=0); +// Check matrix and vector for compatibility in multiply: M * v and v * M +template<class Element1,class Element2> Bool_t AreCompatible(const TMatrixT<Element1> &m, const TVectorT<Element2> &v, Int_t verbose=0); +template<class Element1,class Element2> Bool_t AreCompatible(const TVectorT<Element1> &v, const TMatrixT<Element2> &m, Int_t verbose=0); + +template<class Element> void Compare (const TVectorT <Element> &source1,const TVectorT <Element> &source2); +template<class Element> Bool_t VerifyVectorValue (const TVectorT <Element> &m, Element val,Int_t verbose, Element maxDevAllow); +template<class Element> Bool_t VerifyVectorValue (const TVectorT <Element> &m, Element val,Int_t verbose) + { return VerifyVectorValue(m,val,verbose,Element(0.0)); } +template<class Element> Bool_t VerifyVectorValue (const TVectorT <Element> &m, Element val) + { return VerifyVectorValue(m,val,1,Element(0.0)); } +template<class Element> Bool_t VerifyVectorIdentity (const TVectorT <Element> &m1,const TVectorT <Element> &m2, Int_t verbose, Element maxDevAllow); +template<class Element> Bool_t VerifyVectorIdentity (const TVectorT <Element> &m1,const TVectorT <Element> &m2, Int_t verbose) + { return VerifyVectorIdentity(m1,m2,verbose,Element(0.0)); } +template<class Element> Bool_t VerifyVectorIdentity (const TVectorT <Element> &m1,const TVectorT <Element> &m2) + { return VerifyVectorIdentity(m1,m2,1,Element(0.0)); } + #endif diff --git a/math/matrix/src/TMatrixTSparse.cxx b/math/matrix/src/TMatrixTSparse.cxx index e15b41ba7d664fee8960db93c7e66ac0cd72a36c..612e24e252ced172cedac0d6e6187bff33092aa5 100644 --- a/math/matrix/src/TMatrixTSparse.cxx +++ b/math/matrix/src/TMatrixTSparse.cxx @@ -2737,6 +2737,24 @@ Bool_t AreCompatible(const TMatrixTSparse<Element> &m1,const TMatrixTSparse<Elem return kTRUE; } +//______________________________________________________________________________ +template<class Element> +void TMatrixTSparse<Element>::Streamer(TBuffer &R__b) +{ +// Stream an object of class TMatrixTSparse. + + if (R__b.IsReading()) { + UInt_t R__s, R__c; + Version_t R__v = R__b.ReadVersion(&R__s, &R__c); + Clear(); + R__b.ReadClassBuffer(TMatrixTSparse<Element>::Class(),this,R__v,R__s,R__c); + if (this->fNelems < 0) + this->Invalidate(); + } else { + R__b.WriteClassBuffer(TMatrixTSparse<Element>::Class(),this); + } +} + template class TMatrixTSparse<Float_t>; #ifndef ROOT_TMatrixFSparsefwd diff --git a/math/matrix/src/TVectorT.cxx b/math/matrix/src/TVectorT.cxx index afea92caea06840aa1fa073253584102e522e324..e4c77dde9bc614ca8e5c502a12faa92341e977ff 100644 --- a/math/matrix/src/TVectorT.cxx +++ b/math/matrix/src/TVectorT.cxx @@ -1484,6 +1484,99 @@ Element Dot(const TVectorT<Element> &v1,const TVectorT<Element> &v2) return sum; } +//______________________________________________________________________________ +template <class Element1, class Element2> +TMatrixT<Element1> +OuterProduct(const TVectorT<Element1> &v1,const TVectorT<Element2> &v2) +{ + // Return the matrix M = v1 * v2' + + // TMatrixD::GetSub does: + // TMatrixT tmp; + // Doesn't compile here, because we are outside the class? + // So we'll be explicit: + TMatrixT<Element1> target; + + return OuterProduct(target,v1,v2); +} + +//______________________________________________________________________________ +template <class Element1,class Element2,class Element3> +TMatrixT<Element1> +&OuterProduct(TMatrixT<Element1> &target,const TVectorT<Element2> &v1,const TVectorT<Element3> &v2) +{ + // Return the matrix M = v1 * v2' + + target.ResizeTo(v1.GetLwb(), v1.GetUpb(), v2.GetLwb(), v2.GetUpb()); + + Element1 * mp = target.GetMatrixArray(); + const Element1 * const m_last = mp + target.GetNoElements(); + + const Element2 * v1p = v1.GetMatrixArray(); + const Element2 * const v1_last = v1p + v1.GetNrows(); + + const Element3 * const v20 = v2.GetMatrixArray(); + const Element3 * v2p = v20; + const Element3 * const v2_last = v2p + v2.GetNrows(); + + while (v1p < v1_last) { + v2p = v20; + while (v2p < v2_last) { + *mp++ = *v1p * *v2p++ ; + } + v1p++; + } + + R__ASSERT(v1p == v1_last && mp == m_last && v2p == v2_last); + + return target; +} + +//______________________________________________________________________________ +template <class Element1, class Element2, class Element3> +Element1 Mult(const TVectorT<Element1> &v1,const TMatrixT<Element2> &m, + const TVectorT<Element3> &v2) +{ + // Perform v1 * M * v2, a scalar result + + if (gMatrixCheck) { + if (!AreCompatible(v1, m)) { + ::Error("Mult", "Vector v1 and matrix m incompatible"); + return 0; + } + if (!AreCompatible(m, v2)) { + ::Error("Mult", "Matrix m and vector v2 incompatible"); + return 0; + } + } + + const Element1 * v1p = v1.GetMatrixArray(); // first of v1 + const Element1 * const v1_last = v1p + v1.GetNrows(); // last of v1 + + const Element2 * mp = m.GetMatrixArray(); // first of m + const Element2 * const m_last = mp + m.GetNoElements(); // last of m + + const Element3 * const v20 = v2.GetMatrixArray(); // first of v2 + const Element3 * v2p = v20; // running v2 + const Element3 * const v2_last = v2p + v2.GetNrows(); // last of v2 + + Element1 sum = 0; // scalar result accumulator + Element3 dot = 0; // M_row * v2 dot product accumulator + + while (v1p < v1_last) { + v2p = v20; // at beginning of v2 + while (v2p < v2_last) { // compute (M[i] * v2) dot product + dot += *mp++ * *v2p++; + } + sum += *v1p++ * dot; // v1[i] * (M[i] * v2) + dot = 0; // start next dot product + } + + R__ASSERT(v1p == v1_last && mp == m_last && v2p == v2_last); + + return sum; +} + //______________________________________________________________________________ template<class Element> TVectorT<Element> &Add(TVectorT<Element> &target,Element scalar,const TVectorT<Element> &source) @@ -2054,6 +2147,58 @@ Bool_t AreCompatible(const TVectorT<Element1> &v1,const TVectorT<Element2> &v2,I return kTRUE; } +//______________________________________________________________________________ +template<class Element1, class Element2> +Bool_t AreCompatible(const TMatrixT<Element1> &m,const TVectorT<Element2> &v,Int_t verbose=0) +{ + // Check if m and v are both valid and have compatible shapes for M * v + + if (!m.IsValid()) { + if (verbose) + ::Error("AreCompatible", "Matrix not valid"); + return kFALSE; + } + if (!v.IsValid()) { + if (verbose) + ::Error("AreCompatible", "vector not valid"); + return kFALSE; + } + + if (m.GetNcols() != v.GetNrows() ) { + if (verbose) + ::Error("AreCompatible", "matrix and vector not compatible"); + return kFALSE; + } + + return kTRUE; +} + +//______________________________________________________________________________ +template<class Element1, class Element2> +Bool_t AreCompatible(const TVectorT<Element1> &v,const TMatrixT<Element2> &m,Int_t verbose=0) +{ + // Check if m and v are both valid and have compatible shapes for v * M + + if (!m.IsValid()) { + if (verbose) + ::Error("AreCompatible", "Matrix not valid"); + return kFALSE; + } + if (!v.IsValid()) { + if (verbose) + ::Error("AreCompatible", "vector not valid"); + return kFALSE; + } + + if (v.GetNrows() != m.GetNrows() ) { + if (verbose) + ::Error("AreCompatible", "vector and matrix not compatible"); + return kFALSE; + } + + return kTRUE; +} + //______________________________________________________________________________ template<class Element> void Compare(const TVectorT<Element> &v1,const TVectorT<Element> &v2) @@ -2233,35 +2378,43 @@ template TVectorF operator* <Float_t>(const TMatrixF &a, c template TVectorF operator* <Float_t>(const TMatrixFSym &a, const TVectorF &source); template TVectorF operator* <Float_t>(const TMatrixFSparse &a, const TVectorF &source); template TVectorF operator* <Float_t>( Float_t val, const TVectorF &source); + template Float_t Dot <Float_t>(const TVectorF &v1, const TVectorF &v2); -template TVectorF &Add <Float_t>( TVectorF &target, Float_t scalar, const TVectorF &source); +template TMatrixF OuterProduct <Float_t,Float_t> + (const TVectorF &v1, const TVectorF &v2); +template TMatrixF &OuterProduct <Float_t,Float_t,Float_t> + ( TMatrixF &target, const TVectorF &v1, const TVectorF &v2); +template Float_t Mult <Float_t,Float_t,Float_t> + (const TVectorF &v1, const TMatrixF &m, const TVectorF &v2); + +template TVectorF &Add <Float_t>( TVectorF &target, Float_t scalar, const TVectorF &source); template TVectorF &Add <Float_t>( TVectorF &target, Float_t scalar, const TMatrixF &a, const TVectorF &source); template TVectorF &Add <Float_t>( TVectorF &target, Float_t scalar, const TMatrixFSym &a, const TVectorF &source); template TVectorF &Add <Float_t>( TVectorF &target, Float_t scalar, const TMatrixFSparse &a, const TVectorF &source); -template TVectorF &AddElemMult <Float_t>( TVectorF &target, Float_t scalar, const TVectorF &source1, +template TVectorF &AddElemMult <Float_t>( TVectorF &target, Float_t scalar, const TVectorF &source1, const TVectorF &source2); -template TVectorF &AddElemMult <Float_t>( TVectorF &target, Float_t scalar, const TVectorF &source1, - const TVectorF &source2,const TVectorF &select); -template TVectorF &AddElemDiv <Float_t>( TVectorF &target, Float_t scalar, const TVectorF &source1, +template TVectorF &AddElemMult <Float_t>( TVectorF &target, Float_t scalar, const TVectorF &source1, + const TVectorF &source2,const TVectorF &select); +template TVectorF &AddElemDiv <Float_t>( TVectorF &target, Float_t scalar, const TVectorF &source1, const TVectorF &source2); -template TVectorF &AddElemDiv <Float_t>( TVectorF &target, Float_t scalar, const TVectorF &source1, - const TVectorF &source2,const TVectorF &select); +template TVectorF &AddElemDiv <Float_t>( TVectorF &target, Float_t scalar, const TVectorF &source1, + const TVectorF &source2,const TVectorF &select); template TVectorF &ElementMult <Float_t>( TVectorF &target, const TVectorF &source); -template TVectorF &ElementMult <Float_t>( TVectorF &target, const TVectorF &source, const TVectorF &select); +template TVectorF &ElementMult <Float_t>( TVectorF &target, const TVectorF &source, const TVectorF &select); template TVectorF &ElementDiv <Float_t>( TVectorF &target, const TVectorF &source); -template TVectorF &ElementDiv <Float_t>( TVectorF &target, const TVectorF &source, const TVectorF &select); -template Bool_t AreCompatible <Float_t,Float_t> - (const TVectorF &source1,const TVectorF &source2, Int_t verbose); -template Bool_t AreCompatible <Float_t,Double_t> - (const TVectorF &source1,const TVectorD &source2, Int_t verbose); -template void Compare <Float_t>(const TVectorF &source1,const TVectorF &source2); -template Bool_t VerifyVectorValue <Float_t>(const TVectorF &m, Float_t val, Int_t verbose, - Float_t maxDevAllow); -template Bool_t VerifyVectorIdentity<Float_t>(const TVectorF &m1, const TVectorF &m2, Int_t verbose, - Float_t maxDevAllow); +template TVectorF &ElementDiv <Float_t>( TVectorF &target, const TVectorF &source, const TVectorF &select); + +template Bool_t AreCompatible <Float_t,Float_t> (const TVectorF &v1,const TVectorF &v2,Int_t verbose); +template Bool_t AreCompatible <Float_t,Double_t>(const TVectorF &v1,const TVectorD &v2,Int_t verbose); +template Bool_t AreCompatible <Float_t,Float_t> (const TMatrixF &m, const TVectorF &v, Int_t verbose=0); +template Bool_t AreCompatible <Float_t,Float_t> (const TVectorF &v, const TMatrixF &m, Int_t verbose=0); + +template void Compare <Float_t> (const TVectorF &v1,const TVectorF &v2); +template Bool_t VerifyVectorValue <Float_t> (const TVectorF &m, Float_t val,Int_t verbose,Float_t maxDevAllow); +template Bool_t VerifyVectorIdentity<Float_t> (const TVectorF &m1,const TVectorF &m2, Int_t verbose,Float_t maxDevAllow); #ifndef ROOT_TMatrixDfwd #include "TMatrixDfwd.h" @@ -2283,32 +2436,40 @@ template TVectorD operator* <Double_t>(const TMatrixD &a, template TVectorD operator* <Double_t>(const TMatrixDSym &a, const TVectorD &source); template TVectorD operator* <Double_t>(const TMatrixDSparse &a, const TVectorD &source); template TVectorD operator* <Double_t>( Double_t val, const TVectorD &source); + template Double_t Dot <Double_t>(const TVectorD &v1, const TVectorD &v2); -template TVectorD &Add <Double_t>( TVectorD &target, Double_t scalar, const TVectorD &source); +template TMatrixD OuterProduct <Double_t,Double_t> + (const TVectorD &v1, const TVectorD &v2); +template TMatrixD &OuterProduct <Double_t,Double_t,Double_t> + ( TMatrixD &target, const TVectorD &v1, const TVectorD &v2); +template Double_t Mult <Double_t,Double_t,Double_t> + (const TVectorD &v1, const TMatrixD &m, const TVectorD &v2); + +template TVectorD &Add <Double_t>( TVectorD &target, Double_t scalar, const TVectorD &source); template TVectorD &Add <Double_t>( TVectorD &target, Double_t scalar, const TMatrixD &a, const TVectorD &source); template TVectorD &Add <Double_t>( TVectorD &target, Double_t scalar, const TMatrixDSym &a , const TVectorD &source); template TVectorD &Add <Double_t>( TVectorD &target, Double_t scalar, const TMatrixDSparse &a , const TVectorD &source); -template TVectorD &AddElemMult <Double_t>( TVectorD &target, Double_t scalar, const TVectorD &source1, +template TVectorD &AddElemMult <Double_t>( TVectorD &target, Double_t scalar, const TVectorD &source1, const TVectorD &source2); -template TVectorD &AddElemMult <Double_t>( TVectorD &target, Double_t scalar, const TVectorD &source1, - const TVectorD &source2,const TVectorD &select); -template TVectorD &AddElemDiv <Double_t>( TVectorD &target, Double_t scalar, const TVectorD &source1, +template TVectorD &AddElemMult <Double_t>( TVectorD &target, Double_t scalar, const TVectorD &source1, + const TVectorD &source2,const TVectorD &select); +template TVectorD &AddElemDiv <Double_t>( TVectorD &target, Double_t scalar, const TVectorD &source1, const TVectorD &source2); -template TVectorD &AddElemDiv <Double_t>( TVectorD &target, Double_t scalar, const TVectorD &source1, - const TVectorD &source2,const TVectorD &select); +template TVectorD &AddElemDiv <Double_t>( TVectorD &target, Double_t scalar, const TVectorD &source1, + const TVectorD &source2,const TVectorD &select); template TVectorD &ElementMult <Double_t>( TVectorD &target, const TVectorD &source); -template TVectorD &ElementMult <Double_t>( TVectorD &target, const TVectorD &source, const TVectorD &select); +template TVectorD &ElementMult <Double_t>( TVectorD &target, const TVectorD &source, const TVectorD &select); template TVectorD &ElementDiv <Double_t>( TVectorD &target, const TVectorD &source); -template TVectorD &ElementDiv <Double_t>( TVectorD &target, const TVectorD &source, const TVectorD &select); -template Bool_t AreCompatible<Double_t,Double_t> - (const TVectorD &source1,const TVectorD &source2, Int_t verbose); -template Bool_t AreCompatible<Double_t,Float_t> - (const TVectorD &source1,const TVectorF &source2, Int_t verbose); -template void Compare <Double_t>(const TVectorD &source1,const TVectorD &source2); -template Bool_t VerifyVectorValue <Double_t>(const TVectorD &m, Double_t val, Int_t verbose, - Double_t maxDevAllow); -template Bool_t VerifyVectorIdentity<Double_t>(const TVectorD &m1, const TVectorD &m2, Int_t verbose, - Double_t maxDevAllow); +template TVectorD &ElementDiv <Double_t>( TVectorD &target, const TVectorD &source, const TVectorD &select); + +template Bool_t AreCompatible <Double_t,Double_t>(const TVectorD &v1,const TVectorD &v2,Int_t verbose); +template Bool_t AreCompatible <Double_t,Float_t> (const TVectorD &v1,const TVectorF &v2,Int_t verbose); +template Bool_t AreCompatible <Double_t,Double_t>(const TMatrixD &m, const TVectorD &v, Int_t verbose=0); +template Bool_t AreCompatible <Double_t,Double_t>(const TVectorD &v, const TMatrixD &m, Int_t verbose=0); + +template void Compare <Double_t> (const TVectorD &v1,const TVectorD &v2); +template Bool_t VerifyVectorValue <Double_t> (const TVectorD &m, Double_t val,Int_t verbose,Double_t maxDevAllow); +template Bool_t VerifyVectorIdentity<Double_t> (const TVectorD &m1,const TVectorD &m2, Int_t verbose,Double_t maxDevAllow);