229 Int_t gMatrixCheck = 1;
231 templateClassImp(TMatrixTBase);
237 template<
class Element>
238 void TMatrixTBase<Element>::DoubleLexSort(Int_t n,Int_t *first,Int_t *second,Element *data)
240 const int incs[] = {1,5,19,41,109,209,505,929,2161,3905,8929,16001,INT_MAX};
243 while (incs[kinc] <= n/2)
250 for( ; kinc >= 0; kinc--) {
251 const Int_t inc = incs[kinc];
253 for (Int_t k = inc; k < n; k++) {
254 const Element tmp = data[k];
255 const Int_t fi = first [k];
256 const Int_t se = second[k];
258 for (j = k; j >= inc; j -= inc) {
259 if ( fi < first[j-inc] || (fi == first[j-inc] && se < second[j-inc]) ) {
260 data [j] = data [j-inc];
261 first [j] = first [j-inc];
262 second[j] = second[j-inc];
276 template<
class Element>
277 void TMatrixTBase<Element>::IndexedLexSort(Int_t n,Int_t *first,Int_t swapFirst,
278 Int_t *second,Int_t swapSecond,Int_t *index)
280 const int incs[] = {1,5,19,41,109,209,505,929,2161,3905,8929,16001,INT_MAX};
283 while (incs[kinc] <= n/2)
290 for( ; kinc >= 0; kinc--) {
291 const Int_t inc = incs[kinc];
293 if ( !swapFirst && !swapSecond ) {
294 for (Int_t k = inc; k < n; k++) {
296 const Int_t ktemp = index[k];
297 const Int_t fi = first [ktemp];
298 const Int_t se = second[ktemp];
301 for (j = k; j >= inc; j -= inc) {
303 if (fi < first[index[j-inc]] || (fi == first[index[j-inc]] && se < second[index[j-inc]])) {
307 index[j] = index[j-inc];
318 }
else if ( swapSecond && !swapFirst ) {
319 for (Int_t k = inc; k < n; k++) {
320 const Int_t ktemp = index[k];
321 const Int_t fi = first [ktemp];
322 const Int_t se = second[k];
324 for (j = k; j >= inc; j -= inc) {
325 if (fi < first[index[j-inc]] || (fi == first[index[j-inc]] && se < second[j-inc])) {
326 index [j] = index[j-inc];
327 second[j] = second[j-inc];
335 }
else if (swapFirst && !swapSecond) {
336 for (Int_t k = inc; k < n; k++ ) {
337 const Int_t ktemp = index[k];
338 const Int_t fi = first[k];
339 const Int_t se = second[ktemp];
341 for (j = k; j >= inc; j -= inc) {
342 if ( fi < first[j-inc] || (fi == first[j-inc] && se < second[ index[j-inc]])) {
343 index[j] = index[j-inc];
344 first[j] = first[j-inc];
353 for (Int_t k = inc; k < n; k++ ) {
354 const Int_t ktemp = index[k];
355 const Int_t fi = first [k];
356 const Int_t se = second[k];
358 for (j = k; j >= inc; j -= inc) {
359 if ( fi < first[j-inc] || (fi == first[j-inc] && se < second[j-inc])) {
360 index [j] = index [j-inc];
361 first [j] = first [j-inc];
362 second[j] = second[j-inc];
383 template<
class Element>
384 TMatrixTBase<Element> &TMatrixTBase<Element>::SetMatrixArray(
const Element *data,Option_t *option)
386 R__ASSERT(IsValid());
388 TString opt = option;
391 Element *elem = GetMatrixArray();
392 if (opt.Contains(
"F")) {
393 for (Int_t irow = 0; irow < fNrows; irow++) {
394 const Int_t off1 = irow*fNcols;
396 for (Int_t icol = 0; icol < fNcols; icol++) {
397 elem[off1+icol] = data[off2+irow];
403 memcpy(elem,data,fNelems*
sizeof(Element));
411 template<
class Element>
412 Bool_t TMatrixTBase<Element>::IsSymmetric()
const
414 R__ASSERT(IsValid());
416 if ((fNrows != fNcols) || (fRowLwb != fColLwb))
419 const Element *
const elem = GetMatrixArray();
420 for (Int_t irow = 0; irow < fNrows; irow++) {
421 const Int_t rowOff = irow*fNcols;
423 for (Int_t icol = 0; icol < irow; icol++) {
424 if (elem[rowOff+icol] != elem[colOff+irow])
440 template<
class Element>
441 void TMatrixTBase<Element>::GetMatrix2Array(Element *data,Option_t *option)
const
443 R__ASSERT(IsValid());
445 TString opt = option;
448 const Element *
const elem = GetMatrixArray();
449 if (opt.Contains(
"F")) {
450 for (Int_t irow = 0; irow < fNrows; irow++) {
451 const Int_t off1 = irow*fNcols;
453 for (Int_t icol = 0; icol < fNcols; icol++) {
454 data[off2+irow] = elem[off1+icol];
460 memcpy(data,elem,fNelems*
sizeof(Element));
466 template<
class Element>
467 TMatrixTBase<Element> &TMatrixTBase<Element>::InsertRow(Int_t rown,Int_t coln,
const Element *v,Int_t n)
469 const Int_t arown = rown-fRowLwb;
470 const Int_t acoln = coln-fColLwb;
471 const Int_t nr = (n > 0) ? n : fNcols;
474 if (arown >= fNrows || arown < 0) {
475 Error(
"InsertRow",
"row %d out of matrix range",rown);
479 if (acoln >= fNcols || acoln < 0) {
480 Error(
"InsertRow",
"column %d out of matrix range",coln);
484 if (acoln+nr > fNcols || nr < 0) {
485 Error(
"InsertRow",
"row length %d out of range",nr);
490 const Int_t off = arown*fNcols+acoln;
491 Element *
const elem = GetMatrixArray()+off;
492 memcpy(elem,v,nr*
sizeof(Element));
500 template<
class Element>
501 void TMatrixTBase<Element>::ExtractRow(Int_t rown,Int_t coln,Element *v,Int_t n)
const
503 const Int_t arown = rown-fRowLwb;
504 const Int_t acoln = coln-fColLwb;
505 const Int_t nr = (n > 0) ? n : fNcols;
508 if (arown >= fNrows || arown < 0) {
509 Error(
"ExtractRow",
"row %d out of matrix range",rown);
513 if (acoln >= fNcols || acoln < 0) {
514 Error(
"ExtractRow",
"column %d out of matrix range",coln);
518 if (acoln+n >= fNcols || nr < 0) {
519 Error(
"ExtractRow",
"row length %d out of range",nr);
524 const Int_t off = arown*fNcols+acoln;
525 const Element *
const elem = GetMatrixArray()+off;
526 memcpy(v,elem,nr*
sizeof(Element));
534 template<
class Element>
535 TMatrixTBase<Element> &TMatrixTBase<Element>::Shift(Int_t row_shift,Int_t col_shift)
537 fRowLwb += row_shift;
538 fColLwb += col_shift;
546 template<
class Element>
547 TMatrixTBase<Element> &TMatrixTBase<Element>::Zero()
549 R__ASSERT(IsValid());
550 memset(this->GetMatrixArray(),0,fNelems*
sizeof(Element));
558 template<
class Element>
559 TMatrixTBase<Element> &TMatrixTBase<Element>::Abs()
561 R__ASSERT(IsValid());
563 Element *ep = this->GetMatrixArray();
564 const Element *
const fp = ep+fNelems;
566 *ep = TMath::Abs(*ep);
576 template<
class Element>
577 TMatrixTBase<Element> &TMatrixTBase<Element>::Sqr()
579 R__ASSERT(IsValid());
581 Element *ep = this->GetMatrixArray();
582 const Element *
const fp = ep+fNelems;
594 template<
class Element>
595 TMatrixTBase<Element> &TMatrixTBase<Element>::Sqrt()
597 R__ASSERT(IsValid());
599 Element *ep = this->GetMatrixArray();
600 const Element *
const fp = ep+fNelems;
602 *ep = TMath::Sqrt(*ep);
612 template<
class Element>
613 TMatrixTBase<Element> &TMatrixTBase<Element>::UnitMatrix()
615 R__ASSERT(IsValid());
617 Element *ep = this->GetMatrixArray();
618 memset(ep,0,fNelems*
sizeof(Element));
619 for (Int_t i = fRowLwb; i <= fRowLwb+fNrows-1; i++)
620 for (Int_t j = fColLwb; j <= fColLwb+fNcols-1; j++)
621 *ep++ = (i==j ? 1.0 : 0.0);
631 template<
class Element>
632 TMatrixTBase<Element> &TMatrixTBase<Element>::NormByDiag(
const TVectorT<Element> &v,Option_t *option)
634 R__ASSERT(IsValid());
635 R__ASSERT(v.IsValid());
638 const Int_t nMax = TMath::Max(fNrows,fNcols);
639 if (v.GetNoElements() < nMax) {
640 Error(
"NormByDiag",
"vector shorter than matrix diagonal");
647 const Int_t divide = (opt.Contains(
"D")) ? 1 : 0;
649 const Element *pV = v.GetMatrixArray();
650 Element *mp = this->GetMatrixArray();
653 for (Int_t irow = 0; irow < fNrows; irow++) {
654 if (pV[irow] != 0.0) {
655 for (Int_t icol = 0; icol < fNcols; icol++) {
656 if (pV[icol] != 0.0) {
657 const Element val = TMath::Sqrt(TMath::Abs(pV[irow]*pV[icol]));
660 Error(
"NormbyDiag",
"vector element %d is zero",icol);
665 Error(
"NormbyDiag",
"vector element %d is zero",irow);
670 for (Int_t irow = 0; irow < fNrows; irow++) {
671 for (Int_t icol = 0; icol < fNcols; icol++) {
672 const Element val = TMath::Sqrt(TMath::Abs(pV[irow]*pV[icol]));
685 template<
class Element>
686 Element TMatrixTBase<Element>::RowNorm()
const
688 R__ASSERT(IsValid());
690 const Element * ep = GetMatrixArray();
691 const Element *
const fp = ep+fNelems;
698 for (Int_t j = 0; j < fNcols; j++)
699 sum += TMath::Abs(*ep++);
700 norm = TMath::Max(norm,sum);
712 template<
class Element>
713 Element TMatrixTBase<Element>::ColNorm()
const
715 R__ASSERT(IsValid());
717 const Element * ep = GetMatrixArray();
718 const Element *
const fp = ep+fNcols;
725 for (Int_t i = 0; i < fNrows; i++,ep += fNcols)
726 sum += TMath::Abs(*ep);
728 norm = TMath::Max(norm,sum);
739 template<
class Element>
740 Element TMatrixTBase<Element>::E2Norm()
const
742 R__ASSERT(IsValid());
744 const Element * ep = GetMatrixArray();
745 const Element *
const fp = ep+fNelems;
748 for ( ; ep < fp; ep++)
749 sum += (*ep) * (*ep);
757 template<
class Element>
758 Int_t TMatrixTBase<Element>::NonZeros()
const
760 R__ASSERT(IsValid());
762 Int_t nr_nonzeros = 0;
763 const Element *ep = this->GetMatrixArray();
764 const Element *
const fp = ep+fNelems;
766 if (*ep++ != 0.0) nr_nonzeros++;
774 template<
class Element>
775 Element TMatrixTBase<Element>::Sum()
const
777 R__ASSERT(IsValid());
780 const Element *ep = this->GetMatrixArray();
781 const Element *
const fp = ep+fNelems;
791 template<
class Element>
792 Element TMatrixTBase<Element>::Min()
const
794 R__ASSERT(IsValid());
796 const Element *
const ep = this->GetMatrixArray();
797 const Int_t index = TMath::LocMin(fNelems,ep);
804 template<
class Element>
805 Element TMatrixTBase<Element>::Max()
const
807 R__ASSERT(IsValid());
809 const Element *
const ep = this->GetMatrixArray();
810 const Int_t index = TMath::LocMax(fNelems,ep);
818 template<
class Element>
819 void TMatrixTBase<Element>::Draw(Option_t *option)
821 gROOT->ProcessLine(Form(
"THistPainter::PaintSpecialObjects((TObject*)0x%lx,\"%s\");",
822 (ULong_t)
this, option));
831 template<
class Element>
832 void TMatrixTBase<Element>::Print(Option_t *option)
const
835 Error(
"Print",
"Matrix is invalid");
840 const char *format =
"%11.4g ";
842 const char *f = strstr(option,
"f=");
846 snprintf(topbar,100,format,123.456789);
847 Int_t nch = strlen(topbar)+1;
848 if (nch > 18) nch = 18;
850 for (Int_t i = 0; i < nch; i++) ftopbar[i] =
' ';
851 Int_t nk = 1 + Int_t(TMath::Log10(fNcols));
852 snprintf(ftopbar+nch/2,20-nch/2,
"%s%dd",
"%",nk);
853 Int_t nch2 = strlen(ftopbar);
854 for (Int_t i = nch2; i < nch; i++) ftopbar[i] =
' ';
858 printf(
"\n%dx%d matrix is as follows",fNrows,fNcols);
860 Int_t cols_per_sheet = 5;
861 if (nch <= 8) cols_per_sheet =10;
862 const Int_t ncols = fNcols;
863 const Int_t nrows = fNrows;
864 const Int_t collwb = fColLwb;
865 const Int_t rowlwb = fRowLwb;
866 nk = 5+nch*TMath::Min(cols_per_sheet,fNcols);
867 for (Int_t i = 0; i < nk; i++) topbar[i] =
'-';
869 for (Int_t sheet_counter = 1; sheet_counter <= ncols; sheet_counter += cols_per_sheet) {
871 for (Int_t j = sheet_counter; j < sheet_counter+cols_per_sheet && j <= ncols; j++)
872 printf(ftopbar,j+collwb-1);
873 printf(
"\n%s\n",topbar);
874 if (fNelems <= 0)
continue;
875 for (Int_t i = 1; i <= nrows; i++) {
876 printf(
"%4d |",i+rowlwb-1);
877 for (Int_t j = sheet_counter; j < sheet_counter+cols_per_sheet && j <= ncols; j++)
878 printf(format,(*
this)(i+rowlwb-1,j+collwb-1));
888 template<
class Element>
889 Bool_t TMatrixTBase<Element>::operator==(Element val)
const
891 R__ASSERT(IsValid());
893 if (val == 0. && fNelems == 0)
896 const Element * ep = GetMatrixArray();
897 const Element *
const fp = ep+fNelems;
898 for (; ep < fp; ep++)
908 template<
class Element>
909 Bool_t TMatrixTBase<Element>::operator!=(Element val)
const
911 R__ASSERT(IsValid());
913 if (val == 0. && fNelems == 0)
916 const Element * ep = GetMatrixArray();
917 const Element *
const fp = ep+fNelems;
918 for (; ep < fp; ep++)
928 template<
class Element>
929 Bool_t TMatrixTBase<Element>::operator<(Element val)
const
931 R__ASSERT(IsValid());
933 const Element * ep = GetMatrixArray();
934 const Element *
const fp = ep+fNelems;
935 for (; ep < fp; ep++)
945 template<
class Element>
946 Bool_t TMatrixTBase<Element>::operator<=(Element val)
const
948 R__ASSERT(IsValid());
950 const Element * ep = GetMatrixArray();
951 const Element *
const fp = ep+fNelems;
952 for (; ep < fp; ep++)
962 template<
class Element>
963 Bool_t TMatrixTBase<Element>::operator>(Element val)
const
965 R__ASSERT(IsValid());
967 const Element * ep = GetMatrixArray();
968 const Element *
const fp = ep+fNelems;
969 for (; ep < fp; ep++)
979 template<
class Element>
980 Bool_t TMatrixTBase<Element>::operator>=(Element val)
const
982 R__ASSERT(IsValid());
984 const Element * ep = GetMatrixArray();
985 const Element *
const fp = ep+fNelems;
986 for (; ep < fp; ep++)
996 template<
class Element>
997 TMatrixTBase<Element> &TMatrixTBase<Element>::Apply(
const TElementActionT<Element> &action)
999 R__ASSERT(IsValid());
1001 Element *ep = this->GetMatrixArray();
1002 const Element *
const ep_last = ep+fNelems;
1003 while (ep < ep_last)
1004 action.Operation(*ep++);
1013 template<
class Element>
1014 TMatrixTBase<Element> &TMatrixTBase<Element>::Apply(
const TElementPosActionT<Element> &action)
1016 R__ASSERT(IsValid());
1018 Element *ep = this->GetMatrixArray();
1019 for (action.fI = fRowLwb; action.fI < fRowLwb+fNrows; action.fI++)
1020 for (action.fJ = fColLwb; action.fJ < fColLwb+fNcols; action.fJ++)
1021 action.Operation(*ep++);
1023 R__ASSERT(ep == this->GetMatrixArray()+fNelems);
1031 template<
class Element>
1032 TMatrixTBase<Element> &TMatrixTBase<Element>::Randomize(Element alpha,Element beta,Double_t &seed)
1034 R__ASSERT(IsValid());
1036 const Element scale = beta-alpha;
1037 const Element shift = alpha/scale;
1039 Element * ep = GetMatrixArray();
1040 const Element *
const fp = ep+fNelems;
1042 *ep++ = scale*(Drand(seed)+shift);
1050 template<
class Element>
1051 Bool_t operator==(
const TMatrixTBase<Element> &m1,
const TMatrixTBase<Element> &m2)
1053 if (!AreCompatible(m1,m2))
return kFALSE;
1054 return (memcmp(m1.GetMatrixArray(),m2.GetMatrixArray(),
1055 m1.GetNoElements()*
sizeof(Element)) == 0);
1061 template<
class Element>
1062 Element E2Norm(
const TMatrixTBase<Element> &m1,
const TMatrixTBase<Element> &m2)
1064 if (gMatrixCheck && !AreCompatible(m1,m2)) {
1065 ::Error(
"E2Norm",
"matrices not compatible");
1069 const Element * mp1 = m1.GetMatrixArray();
1070 const Element * mp2 = m2.GetMatrixArray();
1071 const Element *
const fmp1 = mp1+m1.GetNoElements();
1074 for (; mp1 < fmp1; mp1++, mp2++)
1075 sum += (*mp1 - *mp2)*(*mp1 - *mp2);
1083 template<
class Element1,
class Element2>
1084 Bool_t AreCompatible(
const TMatrixTBase<Element1> &m1,
const TMatrixTBase<Element2> &m2,Int_t verbose)
1086 if (!m1.IsValid()) {
1088 ::Error(
"AreCompatible",
"matrix 1 not valid");
1091 if (!m2.IsValid()) {
1093 ::Error(
"AreCompatible",
"matrix 2 not valid");
1097 if (m1.GetNrows() != m2.GetNrows() || m1.GetNcols() != m2.GetNcols() ||
1098 m1.GetRowLwb() != m2.GetRowLwb() || m1.GetColLwb() != m2.GetColLwb()) {
1100 ::Error(
"AreCompatible",
"matrices 1 and 2 not compatible");
1110 template<
class Element>
1111 void Compare(
const TMatrixTBase<Element> &m1,
const TMatrixTBase<Element> &m2)
1113 if (!AreCompatible(m1,m2)) {
1114 Error(
"Compare(const TMatrixTBase<Element> &,const TMatrixTBase<Element> &)",
"matrices are incompatible");
1118 printf(
"\n\nComparison of two TMatrices:\n");
1125 Element difmax = -1;
1127 for (Int_t i = m1.GetRowLwb(); i <= m1.GetRowUpb(); i++) {
1128 for (Int_t j = m1.GetColLwb(); j < m1.GetColUpb(); j++) {
1129 const Element mv1 = m1(i,j);
1130 const Element mv2 = m2(i,j);
1131 const Element diff = TMath::Abs(mv1-mv2);
1133 if (diff > difmax) {
1138 norm1 += TMath::Abs(mv1);
1139 norm2 += TMath::Abs(mv2);
1140 ndiff += TMath::Abs(diff);
1144 printf(
"\nMaximal discrepancy \t\t%g", difmax);
1145 printf(
"\n occured at the point\t\t(%d,%d)",imax,jmax);
1146 const Element mv1 = m1(imax,jmax);
1147 const Element mv2 = m2(imax,jmax);
1148 printf(
"\n Matrix 1 element is \t\t%g", mv1);
1149 printf(
"\n Matrix 2 element is \t\t%g", mv2);
1150 printf(
"\n Absolute error v2[i]-v1[i]\t\t%g", mv2-mv1);
1151 printf(
"\n Relative error\t\t\t\t%g\n",
1152 (mv2-mv1)/TMath::Max(TMath::Abs(mv2+mv1)/2,(Element)1e-7));
1154 printf(
"\n||Matrix 1|| \t\t\t%g", norm1);
1155 printf(
"\n||Matrix 2|| \t\t\t%g", norm2);
1156 printf(
"\n||Matrix1-Matrix2||\t\t\t\t%g", ndiff);
1157 printf(
"\n||Matrix1-Matrix2||/sqrt(||Matrix1|| ||Matrix2||)\t%g\n\n",
1158 ndiff/TMath::Max(TMath::Sqrt(norm1*norm2),1e-7));
1164 template<
class Element>
1165 Bool_t VerifyMatrixValue(
const TMatrixTBase<Element> &m,Element val,Int_t verbose,Element maxDevAllow)
1167 R__ASSERT(m.IsValid());
1174 Element maxDevObs = 0;
1176 if (TMath::Abs(maxDevAllow) <= 0.0)
1177 maxDevAllow = std::numeric_limits<Element>::epsilon();
1179 for (Int_t i = m.GetRowLwb(); i <= m.GetRowUpb(); i++) {
1180 for (Int_t j = m.GetColLwb(); j <= m.GetColUpb(); j++) {
1181 const Element dev = TMath::Abs(m(i,j)-val);
1182 if (dev > maxDevObs) {
1194 printf(
"Largest dev for (%d,%d); dev = |%g - %g| = %g\n",imax,jmax,m(imax,jmax),val,maxDevObs);
1195 if(maxDevObs > maxDevAllow)
1196 Error(
"VerifyElementValue",
"Deviation > %g\n",maxDevAllow);
1199 if(maxDevObs > maxDevAllow)
1207 template<
class Element>
1208 Bool_t VerifyMatrixIdentity(
const TMatrixTBase<Element> &m1,
const TMatrixTBase<Element> &m2,Int_t verbose,
1209 Element maxDevAllow)
1211 if (!AreCompatible(m1,m2,verbose))
1214 if (m1 == 0 && m2 == 0)
1219 Element maxDevObs = 0;
1221 if (TMath::Abs(maxDevAllow) <= 0.0)
1222 maxDevAllow = std::numeric_limits<Element>::epsilon();
1224 for (Int_t i = m1.GetRowLwb(); i <= m1.GetRowUpb(); i++) {
1225 for (Int_t j = m1.GetColLwb(); j <= m1.GetColUpb(); j++) {
1226 const Element dev = TMath::Abs(m1(i,j)-m2(i,j));
1227 if (dev > maxDevObs) {
1239 printf(
"Largest dev for (%d,%d); dev = |%g - %g| = %g\n",
1240 imax,jmax,m1(imax,jmax),m2(imax,jmax),maxDevObs);
1241 if (maxDevObs > maxDevAllow)
1242 Error(
"VerifyMatrixValue",
"Deviation > %g\n",maxDevAllow);
1245 if (maxDevObs > maxDevAllow)
1253 template<
class Element>
1254 void TMatrixTBase<Element>::Streamer(TBuffer &R__b)
1256 if (R__b.IsReading()) {
1258 Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
1260 R__b.ReadClassBuffer(TMatrixTBase<Element>::Class(),
this,R__v,R__s,R__c);
1262 Error(
"TMatrixTBase<Element>::Streamer",
"Unknown version number: %d",R__v);
1265 if (R__v < 4) MakeValid();
1267 R__b.WriteClassBuffer(TMatrixTBase<Element>::Class(),
this);
1272 template<
class Element>
1273 struct nan_value_t {
1274 static Element gNanValue;
1277 Double_t nan_value_t<Double_t>::gNanValue = std::numeric_limits<Double_t>::quiet_NaN();
1279 Float_t nan_value_t<Float_t>::gNanValue = std::numeric_limits<Float_t>::quiet_NaN();
1281 template<
class Element>
1282 Element & TMatrixTBase<Element>::NaNValue()
1284 return nan_value_t<Element>::gNanValue;
1288 template class TMatrixTBase<Float_t>;
1290 template Bool_t
operator== <Float_t>(
const TMatrixFBase &m1,
const TMatrixFBase &m2);
1291 template Float_t E2Norm <Float_t>(
const TMatrixFBase &m1,
const TMatrixFBase &m2);
1292 template Bool_t AreCompatible<Float_t,Float_t>
1293 (
const TMatrixFBase &m1,
const TMatrixFBase &m2,Int_t verbose);
1294 template Bool_t AreCompatible<Float_t,Double_t>
1295 (
const TMatrixFBase &m1,
const TMatrixDBase &m2,Int_t verbose);
1296 template void Compare <Float_t>(
const TMatrixFBase &m1,
const TMatrixFBase &m2);
1297 template Bool_t VerifyMatrixValue <Float_t>(
const TMatrixFBase &m,Float_t val,Int_t verbose,Float_t maxDevAllow);
1298 template Bool_t VerifyMatrixValue <Float_t>(
const TMatrixFBase &m,Float_t val);
1299 template Bool_t VerifyMatrixIdentity<Float_t>(
const TMatrixFBase &m1,
const TMatrixFBase &m2,
1300 Int_t verbose,Float_t maxDevAllowN);
1301 template Bool_t VerifyMatrixIdentity<Float_t>(
const TMatrixFBase &m1,
const TMatrixFBase &m2);
1303 template class TMatrixTBase<Double_t>;
1305 template Bool_t
operator== <Double_t>(
const TMatrixDBase &m1,
const TMatrixDBase &m2);
1306 template Double_t E2Norm <Double_t>(
const TMatrixDBase &m1,
const TMatrixDBase &m2);
1307 template Bool_t AreCompatible<Double_t,Double_t>
1308 (
const TMatrixDBase &m1,
const TMatrixDBase &m2,Int_t verbose);
1309 template Bool_t AreCompatible<Double_t,Float_t>
1310 (
const TMatrixDBase &m1,
const TMatrixFBase &m2,Int_t verbose);
1311 template void Compare <Double_t>(
const TMatrixDBase &m1,
const TMatrixDBase &m2);
1312 template Bool_t VerifyMatrixValue <Double_t>(
const TMatrixDBase &m,Double_t val,Int_t verbose,Double_t maxDevAllow);
1313 template Bool_t VerifyMatrixValue <Double_t>(
const TMatrixDBase &m,Double_t val);
1314 template Bool_t VerifyMatrixIdentity<Double_t>(
const TMatrixDBase &m1,
const TMatrixDBase &m2,
1315 Int_t verbose,Double_t maxDevAllow);
1316 template Bool_t VerifyMatrixIdentity<Double_t>(
const TMatrixDBase &m1,
const TMatrixDBase &m2);