45template<
class Element>
 
   51   if (fRowInd >= matrix.
GetNrows() || fRowInd < 0) {
 
   52      Error(
"TMatrixTRow_const(const TMatrixT<Element> &,Int_t)",
"row index out of bounds");
 
   67template<
class Element>
 
   73   if (fRowInd >= matrix.
GetNrows() || fRowInd < 0) {
 
   74      Error(
"TMatrixTRow_const(const TMatrixTSym &,Int_t)",
"row index out of bounds");
 
   89template<
class Element>
 
   98template<
class Element>
 
  107template<
class Element>
 
  116template<
class Element>
 
  120   Element *rp = 
const_cast<Element *
>(this->fPtr);
 
  121   for ( ; rp < this->fPtr+this->fMatrix->GetNcols(); rp += this->fInc)
 
  125template<
class Element>
 
  129   Element *rp = 
const_cast<Element *
>(this->fPtr);
 
  130   auto litr = 
l.begin();
 
  131   for ( ; rp < this->fPtr+this->fMatrix->GetNcols() && litr != 
l.end(); rp += this->fInc)
 
  138template<
class Element>
 
  142   Element *rp = 
const_cast<Element *
>(this->fPtr);
 
  143   for ( ; rp < this->fPtr+this->fMatrix->GetNcols(); rp += this->fInc)
 
  150template<
class Element>
 
  154   Element *rp = 
const_cast<Element *
>(this->fPtr);
 
  155   for ( ; rp < this->fPtr + this->fMatrix->GetNcols(); rp += this->fInc)
 
  162template<
class Element>
 
  171   if (this->fMatrix->GetNcols() != mt->
GetNcols() || this->fMatrix->GetColLwb() != mt->
GetColLwb()) {
 
  172      Error(
"operator=(const TMatrixTRow_const &)", 
"matrix rows not compatible");
 
  176   Element *rp1 = 
const_cast<Element *
>(this->fPtr);
 
  177   const Element *rp2 = mr.
GetPtr();
 
  178   for ( ; rp1 < this->fPtr+this->fMatrix->GetNcols(); rp1 += this->fInc,rp2 += mr.
GetInc())
 
  186template<
class Element>
 
  192   if (this->fMatrix->GetColLwb() != vec.
GetLwb() || this->fMatrix->GetNcols() != vec.
GetNrows()) {
 
  193      Error(
"operator=(const TVectorT &)",
"vector length != matrix-row length");
 
  197   Element *rp = 
const_cast<Element *
>(this->fPtr);
 
  199   for ( ; rp < this->fPtr+this->fMatrix->GetNcols(); rp += this->fInc)
 
  206template<
class Element>
 
  214   if (this->fMatrix->GetColLwb() != mt->
GetColLwb() || this->fMatrix->GetNcols() != mt->
GetNcols()) {
 
  215      Error(
"operator+=(const TMatrixTRow_const &)",
"different row lengths");
 
  219   Element *rp1 = 
const_cast<Element *
>(this->fPtr);
 
  220   const Element *rp2 = 
r.GetPtr();
 
  221   for ( ; rp1 < this->fPtr+this->fMatrix->GetNcols(); rp1 += this->fInc,rp2 += 
r.GetInc())
 
  229template<
class Element>
 
  237   if (this->fMatrix->GetColLwb() != mt->
GetColLwb() || this->fMatrix->GetNcols() != mt->
GetNcols()) {
 
  238      Error(
"operator*=(const TMatrixTRow_const &)",
"different row lengths");
 
  242   Element *rp1 = 
const_cast<Element *
>(this->fPtr);
 
  243   const Element *rp2 = 
r.GetPtr();
 
  244   for ( ; rp1 < this->fPtr+this->fMatrix->GetNcols(); rp1 += this->fInc,rp2 += 
r.GetInc())
 
  251template<
class Element>
 
  257   if (this->fColInd >= matrix.
GetNcols() || this->fColInd < 0) {
 
  258      Error(
"TMatrixTColumn_const(const TMatrixT &,Int_t)",
"column index out of bounds");
 
  273template<
class Element>
 
  279   if (fColInd >= matrix.
GetNcols() || fColInd < 0) {
 
  280      Error(
"TMatrixTColumn_const(const TMatrixTSym &,Int_t)",
"column index out of bounds");
 
  295template<
class Element>
 
  304template<
class Element>
 
  313template<
class Element>
 
  322template<
class Element>
 
  326   Element *cp = 
const_cast<Element *
>(this->fPtr);
 
  327   for ( ; cp < this->fPtr+this->fMatrix->GetNoElements(); cp += this->fInc)
 
  334template<
class Element>
 
  338   Element *rp = 
const_cast<Element *
>(this->fPtr);
 
  339   auto litr = 
l.begin();
 
  340   for ( ; rp < this->fPtr+this->fMatrix->GetNoElements() && litr != 
l.end(); rp += this->fInc)
 
  347template<
class Element>
 
  351   Element *cp = 
const_cast<Element *
>(this->fPtr);
 
  352   for ( ; cp < this->fPtr+this->fMatrix->GetNoElements(); cp += this->fInc)
 
  359template<
class Element>
 
  363   Element *cp = 
const_cast<Element *
>(this->fPtr);
 
  364   for ( ; cp < this->fPtr+this->fMatrix->GetNoElements(); cp += this->fInc)
 
  371template<
class Element>
 
  380   if (this->fMatrix->GetNrows() != mt->
GetNrows() || this->fMatrix->GetRowLwb() != mt->
GetRowLwb()) {
 
  381      Error(
"operator=(const TMatrixTColumn_const &)", 
"matrix columns not compatible");
 
  385   Element *cp1 = 
const_cast<Element *
>(this->fPtr);
 
  386   const Element *cp2 = mc.
GetPtr();
 
  387   for ( ; cp1 < this->fPtr+this->fMatrix->GetNoElements(); cp1 += this->fInc,cp2 += mc.
GetInc())
 
  394template<
class Element>
 
  400   if (this->fMatrix->GetRowLwb() != vec.
GetLwb() || this->fMatrix->GetNrows() != vec.
GetNrows()) {
 
  401      Error(
"operator=(const TVectorT &)",
"vector length != matrix-column length");
 
  405   Element *cp = 
const_cast<Element *
>(this->fPtr);
 
  407   for ( ; cp < this->fPtr+this->fMatrix->GetNoElements(); cp += this->fInc)
 
  416template<
class Element>
 
  424   if (this->fMatrix->GetRowLwb() != mt->
GetRowLwb() || this->fMatrix->GetNrows() != mt->
GetNrows()) {
 
  425      Error(
"operator+=(const TMatrixTColumn_const &)",
"different row lengths");
 
  429   Element *cp1 = 
const_cast<Element *
>(this->fPtr);
 
  430   const Element *cp2 = mc.
GetPtr();
 
  431   for ( ; cp1 < this->fPtr+this->fMatrix->GetNoElements(); cp1 += this->fInc,cp2 += mc.
GetInc())
 
  439template<
class Element>
 
  447   if (this->fMatrix->GetRowLwb() != mt->
GetRowLwb() || this->fMatrix->GetNrows() != mt->
GetNrows()) {
 
  448      Error(
"operator*=(const TMatrixTColumn_const &)",
"different row lengths");
 
  452   Element *cp1 = 
const_cast<Element *
>(this->fPtr);
 
  453   const Element *cp2 = mc.
GetPtr();
 
  454   for ( ; cp1 < this->fPtr+this->fMatrix->GetNoElements(); cp1 += this->fInc,cp2 += mc.
GetInc())
 
  461template<
class Element>
 
  475template<
class Element>
 
  489template<
class Element>
 
  498template<
class Element>
 
  507template<
class Element>
 
  516template<
class Element>
 
  520   Element *dp = 
const_cast<Element *
>(this->fPtr);
 
  521   for (
Int_t i = 0; i < this->fNdiag; i++, dp += this->fInc)
 
  528template<
class Element>
 
  532   Element *dp = 
const_cast<Element *
>(this->fPtr);
 
  533   for (
Int_t i = 0; i < this->fNdiag; i++, dp += this->fInc)
 
  540template<
class Element>
 
  544   Element *dp = 
const_cast<Element *
>(this->fPtr);
 
  545   for (
Int_t i = 0; i < this->fNdiag; i++, dp += this->fInc)
 
  552template<
class Element>
 
  556   if (this->fMatrix == mt) 
return;
 
  561   if (this->GetNdiags() != md.
GetNdiags()) {
 
  562      Error(
"operator=(const TMatrixTDiag_const &)",
"diagonals not compatible");
 
  566   Element *dp1 = 
const_cast<Element *
>(this->fPtr);
 
  567   const Element *dp2 = md.
GetPtr();
 
  568   for (
Int_t i = 0; i < this->fNdiag; i++, dp1 += this->fInc, dp2 += md.
GetInc())
 
  575template<
class Element>
 
  581   if (this->fNdiag != vec.
GetNrows()) {
 
  582      Error(
"operator=(const TVectorT &)",
"vector length != matrix-diagonal length");
 
  586   Element *dp = 
const_cast<Element *
>(this->fPtr);
 
  596template<
class Element>
 
  604      Error(
"operator=(const TMatrixTDiag_const &)",
"matrix-diagonal's different length");
 
  608   Element *dp1 = 
const_cast<Element *
>(this->fPtr);
 
  609   const Element *dp2 = md.
GetPtr();
 
  610   for (
Int_t i = 0; i < this->fNdiag; i++, dp1 += this->fInc, dp2 += md.
GetInc())
 
  618template<
class Element>
 
  626      Error(
"operator*=(const TMatrixTDiag_const &)",
"matrix-diagonal's different length");
 
  630   Element *dp1 = 
const_cast<Element *
>(this->fPtr);
 
  631   const Element *dp2 = md.
GetPtr();
 
  632   for (
Int_t i = 0; i < this->fNdiag; i++, dp1 += this->fInc, dp2 += md.
GetInc())
 
  639template<
class Element>
 
  652template<
class Element>
 
  665template<
class Element>
 
  674template<
class Element>
 
  683template<
class Element>
 
  692template<
class Element>
 
  696   Element *fp = 
const_cast<Element *
>(this->fPtr);
 
  697   while (fp < this->fPtr+this->fMatrix->GetNoElements())
 
  704template<
class Element>
 
  708   Element *fp = 
const_cast<Element *
>(this->fPtr);
 
  709   while (fp < this->fPtr+this->fMatrix->GetNoElements())
 
  716template<
class Element>
 
  720   Element *fp = 
const_cast<Element *
>(this->fPtr);
 
  721   while (fp < this->fPtr+this->fMatrix->GetNoElements())
 
  728template<
class Element>
 
  732   if (this->fMatrix->GetMatrixArray() == mt->
GetMatrixArray()) 
return;
 
  737      Error(
"operator=(const TMatrixTFlat_const &)",
"matrix lengths different");
 
  741   Element *fp1 = 
const_cast<Element *
>(this->fPtr);
 
  742   const Element *fp2 = mf.
GetPtr();
 
  743   while (fp1 < this->fPtr+this->fMatrix->GetNoElements())
 
  750template<
class Element>
 
  755   if (this->fMatrix->GetNoElements() != vec.
GetNrows()) {
 
  756      Error(
"operator=(const TVectorT &)",
"vector length != # matrix-elements");
 
  760   Element *fp = 
const_cast<Element *
>(this->fPtr);
 
  762   while (fp < this->fPtr+this->fMatrix->GetNoElements())
 
  769template<
class Element>
 
  777      Error(
"operator+=(const TMatrixTFlat_const &)",
"matrices lengths different");
 
  781   Element *fp1 = 
const_cast<Element *
>(this->fPtr);
 
  782   const Element *fp2 = mf.
GetPtr();
 
  783   while (fp1 < this->fPtr + this->fMatrix->GetNoElements())
 
  790template<
class Element>
 
  798      Error(
"operator*=(const TMatrixTFlat_const &)",
"matrices lengths different");
 
  802   Element *fp1 = 
const_cast<Element *
>(this->fPtr);
 
  803   const Element *fp2 = mf.
GetPtr();
 
  804   while (fp1 < this->fPtr + this->fMatrix->GetNoElements())
 
  813template<
class Element>
 
  825   if (row_upbs < row_lwbs) {
 
  826      Error(
"TMatrixTSub_const",
"Request sub-matrix with row_upbs(%d) < row_lwbs(%d)",row_upbs,row_lwbs);
 
  829   if (col_upbs < col_lwbs) {
 
  830      Error(
"TMatrixTSub_const",
"Request sub-matrix with col_upbs(%d) < col_lwbs(%d)",col_upbs,col_lwbs);
 
  839   if (row_lwbs < rowLwb || row_lwbs > rowUpb) {
 
  840      Error(
"TMatrixTSub_const",
"Request row_lwbs sub-matrix(%d) outside matrix range of %d - %d",row_lwbs,rowLwb,rowUpb);
 
  843   if (col_lwbs < colLwb || col_lwbs > colUpb) {
 
  844      Error(
"TMatrixTSub_const",
"Request col_lwbs sub-matrix(%d) outside matrix range of %d - %d",col_lwbs,colLwb,colUpb);
 
  847   if (row_upbs < rowLwb || row_upbs > rowUpb) {
 
  848      Error(
"TMatrixTSub_const",
"Request row_upbs sub-matrix(%d) outside matrix range of %d - %d",row_upbs,rowLwb,rowUpb);
 
  851   if (col_upbs < colLwb || col_upbs > colUpb) {
 
  852      Error(
"TMatrixTSub_const",
"Request col_upbs sub-matrix(%d) outside matrix range of %d - %d",col_upbs,colLwb,colUpb);
 
  856   fRowOff    = row_lwbs-rowLwb;
 
  857   fColOff    = col_lwbs-colLwb;
 
  858   fNrowsSub  = row_upbs-row_lwbs+1;
 
  859   fNcolsSub  = col_upbs-col_lwbs+1;
 
  867template<
class Element>
 
  879   if (row_upbs < row_lwbs) {
 
  880      Error(
"TMatrixTSub_const",
"Request sub-matrix with row_upbs(%d) < row_lwbs(%d)",row_upbs,row_lwbs);
 
  883   if (col_upbs < col_lwbs) {
 
  884      Error(
"TMatrixTSub_const",
"Request sub-matrix with col_upbs(%d) < col_lwbs(%d)",col_upbs,col_lwbs);
 
  893   if (row_lwbs < rowLwb || row_lwbs > rowUpb) {
 
  894      Error(
"TMatrixTSub_const",
"Request row_lwbs sub-matrix(%d) outside matrix range of %d - %d",row_lwbs,rowLwb,rowUpb);
 
  897   if (col_lwbs < colLwb || col_lwbs > colUpb) {
 
  898      Error(
"TMatrixTSub_const",
"Request col_lwbs sub-matrix(%d) outside matrix range of %d - %d",col_lwbs,colLwb,colUpb);
 
  901   if (row_upbs < rowLwb || row_upbs > rowUpb) {
 
  902      Error(
"TMatrixTSub_const",
"Request row_upbs sub-matrix(%d) outside matrix range of %d - %d",row_upbs,rowLwb,rowUpb);
 
  905   if (col_upbs < colLwb || col_upbs > colUpb) {
 
  906      Error(
"TMatrixTSub_const",
"Request col_upbs sub-matrix(%d) outside matrix range of %d - %d",col_upbs,colLwb,colUpb);
 
  910   fRowOff    = row_lwbs-rowLwb;
 
  911   fColOff    = col_lwbs-colLwb;
 
  912   fNrowsSub  = row_upbs-row_lwbs+1;
 
  913   fNcolsSub  = col_upbs-col_lwbs+1;
 
  919template<
class Element>
 
  929template<
class Element>
 
  939template<
class Element>
 
  949template<
class Element>
 
  955   if (
v.GetNoElements() < 
TMath::Max(this->fNrowsSub,this->fNcolsSub)) {
 
  956      Error(
"Rank1Update",
"vector too short");
 
  960   const Element * 
const pv = 
v.GetMatrixArray();
 
  963   const Int_t ncols = this->fMatrix->GetNcols();
 
  964   for (
Int_t irow = 0; irow < this->fNrowsSub; irow++) {
 
  965      const Int_t off = (irow+this->fRowOff)*ncols+this->fColOff;
 
  966      const Element tmp = alpha*pv[irow];
 
  967      for (
Int_t icol = 0; icol < this->fNcolsSub; icol++)
 
  968         mp[off+icol] += tmp*pv[icol];
 
  975template<
class Element>
 
  981   const Int_t ncols = this->fMatrix->GetNcols();
 
  982   for (
Int_t irow = 0; irow < this->fNrowsSub; irow++) {
 
  983      const Int_t off = (irow+this->fRowOff)*ncols+this->fColOff;
 
  984      for (
Int_t icol = 0; icol < this->fNcolsSub; icol++)
 
  992template<
class Element>
 
  998   const Int_t ncols = this->fMatrix->GetNcols();
 
  999   for (
Int_t irow = 0; irow < this->fNrowsSub; irow++) {
 
 1000      const Int_t off = (irow+this->fRowOff)*ncols+this->fColOff;
 
 1001      for (
Int_t icol = 0; icol < this->fNcolsSub; icol++)
 
 1009template<
class Element>
 
 1015   const Int_t ncols = this->fMatrix->GetNcols();
 
 1016   for (
Int_t irow = 0; irow < this->fNrowsSub; irow++) {
 
 1017      const Int_t off = (irow+this->fRowOff)*ncols+this->fColOff;
 
 1018      for (
Int_t icol = 0; icol < this->fNcolsSub; icol++)
 
 1026template<
class Element>
 
 1034   if (this->fMatrix == mt &&
 
 1035       (this->GetNrows()  == 
ms.GetNrows () && this->GetNcols()  == 
ms.GetNcols () &&
 
 1036        this->GetRowOff() == 
ms.GetRowOff() && this->GetColOff() == 
ms.GetColOff()) )
 
 1039   if (this->GetNrows() != 
ms.GetNrows() || this->GetNcols() != 
ms.GetNcols()) {
 
 1040     Error(
"operator=(const TMatrixTSub_const &)",
"sub matrices have different size");
 
 1044   const Int_t rowOff2 = 
ms.GetRowOff();
 
 1045   const Int_t colOff2 = 
ms.GetColOff();
 
 1047   Bool_t overlap = (this->fMatrix == mt) &&
 
 1048                    ( (rowOff2 >= this->fRowOff && rowOff2 < this->fRowOff+this->fNrowsSub) ||
 
 1049                      (colOff2 >= this->fColOff && colOff2 < this->fColOff+this->fNcolsSub) );
 
 1051   Element *p1 = 
const_cast<Element *
>(this->fMatrix->GetMatrixArray());
 
 1055      const Int_t ncols1 = this->fMatrix->GetNcols();
 
 1057      for (
Int_t irow = 0; irow < this->fNrowsSub; irow++) {
 
 1058         const Int_t off1 = (irow+this->fRowOff)*ncols1+this->fColOff;
 
 1059         const Int_t off2 = (irow+rowOff2)*ncols2+colOff2;
 
 1060         for (
Int_t icol = 0; icol < this->fNcolsSub; icol++)
 
 1061            p1[off1+icol] = p2[off2+icol];
 
 1065      const Int_t row_upbs = row_lwbs+this->fNrowsSub-1;
 
 1067      const Int_t col_upbs = col_lwbs+this->fNcolsSub-1;
 
 1071      const Int_t ncols1 = this->fMatrix->GetNcols();
 
 1073      for (
Int_t irow = 0; irow < this->fNrowsSub; irow++) {
 
 1074         const Int_t off1 = (irow+this->fRowOff)*ncols1+this->fColOff;
 
 1075         const Int_t off2 = irow*ncols2;
 
 1076         for (
Int_t icol = 0; icol < this->fNcolsSub; icol++)
 
 1077            p1[off1+icol] = p2[off2+icol];
 
 1085template<
class Element>
 
 1091   if (this->fMatrix->GetMatrixArray() == 
m.GetMatrixArray()) 
return;
 
 1093   if (this->fNrowsSub != 
m.GetNrows() || this->fNcolsSub != 
m.GetNcols()) {
 
 1094      Error(
"operator=(const TMatrixTBase<Element> &)",
"sub matrices and matrix have different size");
 
 1097   const Int_t row_lwbs = this->fRowOff+this->fMatrix->GetRowLwb();
 
 1098   const Int_t col_lwbs = this->fColOff+this->fMatrix->GetColLwb();
 
 1105template<
class Element>
 
 1113   if (this->GetNrows() != 
ms.GetNrows() || this->GetNcols() != 
ms.GetNcols()) {
 
 1114      Error(
"operator+=(const TMatrixTSub_const &)",
"sub matrices have different size");
 
 1118   const Int_t rowOff2 = 
ms.GetRowOff();
 
 1119   const Int_t colOff2 = 
ms.GetColOff();
 
 1121   Bool_t overlap = (this->fMatrix == mt) &&
 
 1122                    ( (rowOff2 >= this->fRowOff && rowOff2 < this->fRowOff+this->fNrowsSub) ||
 
 1123                      (colOff2 >= this->fColOff && colOff2 < this->fColOff+this->fNcolsSub) );
 
 1125   Element *p1 = 
const_cast<Element *
>(this->fMatrix->GetMatrixArray());
 
 1129      const Int_t ncols1 = this->fMatrix->GetNcols();
 
 1131      for (
Int_t irow = 0; irow < this->fNrowsSub; irow++) {
 
 1132         const Int_t off1 = (irow+this->fRowOff)*ncols1+this->fColOff;
 
 1133         const Int_t off2 = (irow+rowOff2)*ncols2+colOff2;
 
 1134         for (
Int_t icol = 0; icol < this->fNcolsSub; icol++)
 
 1135            p1[off1+icol] += p2[off2+icol];
 
 1139      const Int_t row_upbs = row_lwbs+this->fNrowsSub-1;
 
 1141      const Int_t col_upbs = col_lwbs+this->fNcolsSub-1;
 
 1145      const Int_t ncols1 = this->fMatrix->GetNcols();
 
 1147      for (
Int_t irow = 0; irow < this->fNrowsSub; irow++) {
 
 1148         const Int_t off1 = (irow+this->fRowOff)*ncols1+this->fColOff;
 
 1149         const Int_t off2 = irow*ncols2;
 
 1150         for (
Int_t icol = 0; icol < this->fNcolsSub; icol++)
 
 1151            p1[off1+icol] += p2[off2+icol];
 
 1159template<
class Element>
 
 1162   if (this->fNcolsSub != 
ms.GetNrows() || this->fNcolsSub != 
ms.GetNcols()) {
 
 1163      Error(
"operator*=(const TMatrixTSub_const &)",
"source sub matrix has wrong shape");
 
 1172      const Int_t row_upbs = row_lwbs+this->fNrowsSub-1;
 
 1174      const Int_t col_upbs = col_lwbs+this->fNcolsSub-1;
 
 1175      source->
GetSub(row_lwbs,row_upbs,col_lwbs,col_upbs,source_sub);
 
 1179   const Int_t ncols = this->fMatrix->GetNcols();
 
 1182   Element work[kWorkMax];
 
 1184   Element *trp = work;
 
 1185   if (this->fNcolsSub > kWorkMax) {
 
 1186      isAllocated = 
kTRUE;
 
 1187      trp = 
new Element[this->fNcolsSub];
 
 1190         Element *cp   = 
const_cast<Element *
>(this->fMatrix->GetMatrixArray())+this->fRowOff*ncols+this->fColOff;
 
 1191   const Element *trp0 = cp; 
 
 1192   const Element * 
const trp0_last = trp0+this->fNrowsSub*ncols;
 
 1193   while (trp0 < trp0_last) {
 
 1194      memcpy(trp,trp0,this->fNcolsSub*
sizeof(Element));         
 
 1195      for (
const Element *scp = sp; scp < sp+this->fNcolsSub; ) {  
 
 1198         for (
Int_t j = 0; j < this->fNcolsSub; j++) {
 
 1199            cij += trp[j] * *scp;                            
 
 1200            scp += this->fNcolsSub;
 
 1205      cp   += ncols-this->fNcolsSub;
 
 1210   R__ASSERT(cp == trp0_last && trp0 == trp0_last);
 
 1218template<
class Element>
 
 1224   if (this->GetNrows() != mt.
GetNrows() || this->GetNcols() != mt.
GetNcols()) {
 
 1225      Error(
"operator+=(const TMatrixTBase<Element> &)",
"sub matrix and matrix have different size");
 
 1229   Element *p1 = 
const_cast<Element *
>(this->fMatrix->GetMatrixArray());
 
 1232   const Int_t ncols1 = this->fMatrix->GetNcols();
 
 1234   for (
Int_t irow = 0; irow < this->fNrowsSub; irow++) {
 
 1235      const Int_t off1 = (irow+this->fRowOff)*ncols1+this->fColOff;
 
 1236      const Int_t off2 = irow*ncols2;
 
 1237      for (
Int_t icol = 0; icol < this->fNcolsSub; icol++)
 
 1238         p1[off1+icol] += p2[off2+icol];
 
 1245template<
class Element>
 
 1248   if (this->fNcolsSub != source.
GetNrows() || this->fNcolsSub != source.
GetNcols()) {
 
 1249      Error(
"operator*=(const TMatrixT<Element> &)",
"source matrix has wrong shape");
 
 1256   if (this->fMatrix->GetMatrixArray() == source.
GetMatrixArray()) {
 
 1264   const Int_t ncols = this->fMatrix->GetNcols();
 
 1267   Element work[kWorkMax];
 
 1269    Element *trp = work;
 
 1270   if (this->fNcolsSub > kWorkMax) {
 
 1271      isAllocated = 
kTRUE;
 
 1272      trp = 
new Element[this->fNcolsSub];
 
 1275         Element *cp   = 
const_cast<Element *
>(this->fMatrix->GetMatrixArray())+this->fRowOff*ncols+this->fColOff;
 
 1276   const Element *trp0 = cp;                               
 
 1277   const Element * 
const trp0_last = trp0+this->fNrowsSub*ncols;
 
 1278   while (trp0 < trp0_last) {
 
 1279      memcpy(trp,trp0,this->fNcolsSub*
sizeof(Element));           
 
 1280      for (
const Element *scp = sp; scp < sp+this->fNcolsSub; ) { 
 
 1283         for (
Int_t j = 0; j < this->fNcolsSub; j++) {
 
 1284            cij += trp[j] * *scp;                              
 
 1285            scp += this->fNcolsSub;
 
 1290      cp   += ncols-this->fNcolsSub;
 
 1295   R__ASSERT(cp == trp0_last && trp0 == trp0_last);
 
 1303template<
class Element>
 
 1306   if (this->fNcolsSub != source.
GetNrows() || this->fNcolsSub != source.
GetNcols()) {
 
 1307      Error(
"operator*=(const TMatrixTSym<Element> &)",
"source matrix has wrong shape");
 
 1314   if (this->fMatrix->GetMatrixArray() == source.
GetMatrixArray()) {
 
 1322   const Int_t ncols = this->fMatrix->GetNcols();
 
 1325   Element work[kWorkMax];
 
 1327   Element *trp = work;
 
 1328   if (this->fNcolsSub > kWorkMax) {
 
 1329      isAllocated = 
kTRUE;
 
 1330      trp = 
new Element[this->fNcolsSub];
 
 1333         Element *cp   = 
const_cast<Element *
>(this->fMatrix->GetMatrixArray())+this->fRowOff*ncols+this->fColOff;
 
 1334   const Element *trp0 = cp;                               
 
 1335   const Element * 
const trp0_last = trp0+this->fNrowsSub*ncols;
 
 1336   while (trp0 < trp0_last) {
 
 1337      memcpy(trp,trp0,this->fNcolsSub*
sizeof(Element));           
 
 1338      for (
const Element *scp = sp; scp < sp+this->fNcolsSub; ) { 
 
 1341         for (
Int_t j = 0; j < this->fNcolsSub; j++) {
 
 1342            cij += trp[j] * *scp;                              
 
 1343            scp += this->fNcolsSub;
 
 1348      cp   += ncols-this->fNcolsSub;
 
 1353   R__ASSERT(cp == trp0_last && trp0 == trp0_last);
 
 1361template<
class Element>
 
 1367   if (fRowInd >= matrix.
GetNrows() || fRowInd < 0) {
 
 1368      Error(
"TMatrixTSparseRow_const(const TMatrixTSparse &,Int_t)",
"row index out of bounds");
 
 1379   fNindex  = eIndex-sIndex;
 
 1386template<
class Element>
 
 1391  const Int_t acoln = i-fMatrix->GetColLwb();
 
 1392  if (acoln < fMatrix->GetNcols() && acoln >= 0) {
 
 1394     if (index >= 0 && fColPtr[index] == acoln) 
return fDataPtr[index];
 
 1397     Error(
"operator()",
"Request col(%d) outside matrix range of %d - %d",
 
 1398                        i,fMatrix->GetColLwb(),fMatrix->GetColLwb()+fMatrix->GetNcols());
 
 1406template<
class Element>
 
 1415template<
class Element>
 
 1424template<
class Element>
 
 1429   const Int_t acoln = i-this->fMatrix->GetColLwb();
 
 1430   if (acoln < this->fMatrix->GetNcols() && acoln >= 0) {
 
 1432      if (index >= 0 && this->fColPtr[index] == acoln) 
return this->fDataPtr[index];
 
 1435      Error(
"operator()",
"Request col(%d) outside matrix range of %d - %d",
 
 1436            i,this->fMatrix->GetColLwb(),this->fMatrix->GetColLwb()+this->fMatrix->GetNcols());
 
 1444template<
class Element>
 
 1450   const Int_t acoln = i-this->fMatrix->GetColLwb();
 
 1451   if (acoln >= this->fMatrix->GetNcols() || acoln < 0) {
 
 1452      Error(
"operator()(Int_t",
"Requested element %d outside range : %d - %d",i,
 
 1453            this->fMatrix->GetColLwb(),this->fMatrix->GetColLwb()+this->fMatrix->GetNcols());
 
 1458   if (index >= 0 && this->fColPtr[index] == acoln)
 
 1459      return (
const_cast<Element*
>(this->fDataPtr))[index];
 
 1467      this->fNindex  = eIndex-sIndex;
 
 1471      if (index >= 0 && this->fColPtr[index] == acoln)
 
 1472         return (
const_cast<Element*
>(this->fDataPtr))[index];
 
 1474         Error(
"operator()(Int_t",
"Insert row failed");
 
 1483template<
class Element>
 
 1487   Element *rp = 
const_cast<Element *
>(this->fDataPtr);
 
 1488   for ( ; rp < this->fDataPtr+this->fNindex; rp++)
 
 1495template<
class Element>
 
 1499   Element *rp = 
const_cast<Element *
>(this->fDataPtr);
 
 1500   for ( ; rp < this->fDataPtr+this->fNindex; rp++)
 
 1507template<
class Element>
 
 1511   Element *rp = 
const_cast<Element *
>(this->fDataPtr);
 
 1512   for ( ; rp < this->fDataPtr+this->fNindex; rp++)
 
 1519template<
class Element>
 
 1523   if (this->fMatrix == mt) 
return;
 
 1527   if (this->fMatrix->GetColLwb() != mt->
GetColLwb() || this->fMatrix->GetNcols() != mt->
GetNcols()) {
 
 1528      Error(
"operator=(const TMatrixTSparseRow_const &)",
"matrix rows not compatible");
 
 1532   const Int_t ncols = this->fMatrix->GetNcols();
 
 1533   const Int_t row1  = this->fRowInd+this->fMatrix->GetRowLwb();
 
 1535   const Int_t col   = this->fMatrix->GetColLwb();
 
 1542   const Int_t eIndex = this->fMatrix->GetRowIndexArray()[this->fRowInd+1];
 
 1543   this->fNindex  = eIndex-sIndex;
 
 1552template<
class Element>
 
 1558   if (this->fMatrix->GetColLwb() != vec.
GetLwb() || this->fMatrix->GetNcols() != vec.
GetNrows()) {
 
 1559      Error(
"operator=(const TVectorT &)",
"vector length != matrix-row length");
 
 1564   const Int_t row = this->fRowInd+this->fMatrix->GetRowLwb();
 
 1565   const Int_t col = this->fMatrix->GetColLwb();
 
 1569   const Int_t eIndex = this->fMatrix->GetRowIndexArray()[this->fRowInd+1];
 
 1570   this->fNindex  = eIndex-sIndex;
 
 1578template<
class Element>
 
 1585   if (this->fMatrix->GetColLwb() != mt->
GetColLwb() || this->fMatrix->GetNcols() != mt->
GetNcols()) {
 
 1586      Error(
"operator+=(const TMatrixTRow_const &)",
"different row lengths");
 
 1590   const Int_t ncols = this->fMatrix->GetNcols();
 
 1591   const Int_t row1  = this->fRowInd+this->fMatrix->GetRowLwb();
 
 1593   const Int_t col   = this->fMatrix->GetColLwb();
 
 1597   this->fMatrix->ExtractRow(row1,col,
v1.GetMatrixArray());
 
 1603   const Int_t eIndex = this->fMatrix->GetRowIndexArray()[this->fRowInd+1];
 
 1604   this->fNindex  = eIndex-sIndex;
 
 1613template<
class Element>
 
 1620   if (this->fMatrix->GetColLwb() != mt->
GetColLwb() || this->fMatrix->GetNcols() != mt->
GetNcols()) {
 
 1621      Error(
"operator+=(const TMatrixTRow_const &)",
"different row lengths");
 
 1625   const Int_t ncols = this->fMatrix->GetNcols();
 
 1628   const Int_t col   = this->fMatrix->GetColLwb();
 
 1632   this->fMatrix->ExtractRow(row1,col,
v1.GetMatrixArray());
 
 1639   const Int_t eIndex = this->fMatrix->GetRowIndexArray()[this->fRowInd+1];
 
 1640   this->fNindex  = eIndex-sIndex;
 
 1648template<
class Element>
 
 1660template<
class Element>
 
 1664  if (i < fNdiag && i >= 0) {
 
 1665     const Int_t   * 
const pR = fMatrix->GetRowIndexArray();
 
 1666     const Int_t   * 
const pC = fMatrix->GetColIndexArray();
 
 1667     const Element * 
const pD = fMatrix->GetMatrixArray();
 
 1668     const Int_t sIndex = pR[i];
 
 1669     const Int_t eIndex = pR[i+1];
 
 1671     if (index >= sIndex && pC[index] == i) 
return pD[index];
 
 1674     Error(
"operator()",
"Request diagonal(%d) outside matrix range of 0 - %d",i,fNdiag);
 
 1683template<
class Element>
 
 1692template<
class Element>
 
 1701template<
class Element>
 
 1705    if (i < this->fNdiag && i >= 0) {
 
 1706       const Int_t   * 
const pR = this->fMatrix->GetRowIndexArray();
 
 1707       const Int_t   * 
const pC = this->fMatrix->GetColIndexArray();
 
 1708       const Element * 
const pD = this->fMatrix->GetMatrixArray();
 
 1709       const Int_t sIndex = pR[i];
 
 1710       const Int_t eIndex = pR[i+1];
 
 1712       if (index >= sIndex && pC[index] == i) 
return pD[index];
 
 1715       Error(
"operator()",
"Request diagonal(%d) outside matrix range of 0 - %d",i,this->fNdiag);
 
 1724template<
class Element>
 
 1729   if (i < 0 || i >= this->fNdiag) {
 
 1730      Error(
"operator()(Int_t",
"Requested element %d outside range : 0 - %d",i,this->fNdiag);
 
 1731      return (
const_cast<Element*
>(this->fDataPtr))[0];
 
 1737   Int_t sIndex = pR[i];
 
 1738   Int_t eIndex = pR[i+1];
 
 1740   if (index >= sIndex && pC[index] == i)
 
 1741      return (
const_cast<Element*
>(this->fDataPtr))[index];
 
 1753      if (index >= sIndex && pC[index] == i)
 
 1754         return (
const_cast<Element*
>(this->fDataPtr))[index];
 
 1756         Error(
"operator()(Int_t",
"Insert row failed");
 
 1757         return (
const_cast<Element*
>(this->fDataPtr))[0];
 
 1765template<
class Element>
 
 1769   for (
Int_t i = 0; i < this->fNdiag; i++)
 
 1776template<
class Element>
 
 1780   for (
Int_t i = 0; i < this->fNdiag; i++)
 
 1787template<
class Element>
 
 1791   for (
Int_t i = 0; i < this->fNdiag; i++)
 
 1798template<
class Element>
 
 1802   if (this->fMatrix == mt) 
return;
 
 1807      Error(
"operator=(const TMatrixTSparseDiag_const &)",
"matrix-diagonal's different length");
 
 1811   for (
Int_t i = 0; i < this->fNdiag; i++)
 
 1818template<
class Element>
 
 1824   if (this->fNdiag != vec.
GetNrows()) {
 
 1825      Error(
"operator=(const TVectorT &)",
"vector length != matrix-diagonal length");
 
 1830   for (
Int_t i = 0; i < this->fNdiag; i++)
 
 1838template<
class Element>
 
 1846      Error(
"operator+=(const TMatrixTSparseDiag_const &)",
"matrix-diagonal's different length");
 
 1850   for (
Int_t i = 0; i < this->fNdiag; i++)
 
 1851      (*
this)(i) += md(i);
 
 1858template<
class Element>
 
 1866      Error(
"operator*=(const TMatrixTSparseDiag_const &)",
"matrix-diagonal's different length");
 
 1870   for (
Int_t i = 0; i < this->fNdiag; i++)
 
 1871      (*
this)(i) *= md(i);
 
 1889   Int_t leftloint = (int) leftlo;
 
 1895   ix = (((xalo-leftlo*b16)-p)+(fhi-k*b15)*b16)+k;
 
 1896   if (ix < 0.0) ix = ix+p;
 
 1898   return (ix*4.656612875e-10);
 
void Error(const char *location, const char *msgfmt,...)
 
Double_t Drand(Double_t &ix)
Random number generator [0....1] with seed ix.
 
TMatrixT< Element > & ElementMult(TMatrixT< Element > &target, const TMatrixT< Element > &source)
Multiply target by the source, element-by-element.
 
virtual const Element * GetMatrixArray() const =0
 
virtual TMatrixTBase< Element > & GetSub(Int_t row_lwb, Int_t row_upb, Int_t col_lwb, Int_t col_upb, TMatrixTBase< Element > &target, Option_t *option="S") const =0
 
Int_t GetNoElements() const
 
static Element & NaNValue()
 
virtual void ExtractRow(Int_t row, Int_t col, Element *v, Int_t n=-1) const
Store in array v, n matrix elements of row rown starting at column coln.
 
Int_t GetColIndex() const
 
const TMatrixTBase< Element > * GetMatrix() const
 
const Element * GetPtr() const
 
void operator+=(Element val)
Add val to every element of the matrix column.
 
void operator=(Element val)
 
void Assign(Element val)
Assign val to every element of the matrix column.
 
void operator*=(Element val)
Multiply every element of the matrix column with val.
 
const Element * GetPtr() const
 
const TMatrixTBase< Element > * GetMatrix() const
 
void operator+=(Element val)
Assign val to every element of the matrix diagonal.
 
void operator=(Element val)
Assign val to every element of the matrix diagonal.
 
void operator*=(Element val)
Assign val to every element of the matrix diagonal.
 
const TMatrixTBase< Element > * GetMatrix() const
 
const Element * GetPtr() const
 
void operator+=(Element val)
Add val to every element of the matrix.
 
void operator*=(Element val)
Multiply every element of the matrix with val.
 
void operator=(Element val)
Assign val to every element of the matrix.
 
const Element * GetPtr() const
 
Int_t GetRowIndex() const
 
const TMatrixTBase< Element > * GetMatrix() const
 
void Assign(Element val)
Assign val to every element of the matrix row.
 
void operator*=(Element val)
Multiply every element of the matrix row with val.
 
void operator+=(Element val)
Add val to every element of the matrix row.
 
void operator=(std::initializer_list< Element > l)
 
TMatrixTSparseDiag_const()
 
Element operator()(Int_t i) const
 
const TMatrixTBase< Element > * GetMatrix() const
 
Element operator()(Int_t i) const
 
void operator=(Element val)
Assign val to every element of the matrix diagonal.
 
void operator*=(Element val)
Multiply every element of the matrix diagonal by val.
 
void operator+=(Element val)
Add val to every element of the matrix diagonal.
 
TMatrixTSparseRow_const()
 
Int_t GetRowIndex() const
 
Element operator()(Int_t i) const
 
const TMatrixTBase< Element > * GetMatrix() const
 
void operator+=(Element val)
Add val to every non-zero (!) element of the matrix row.
 
void operator=(Element val)
Assign val to every non-zero (!) element of the matrix row.
 
void operator*=(Element val)
Multiply every element of the matrix row by val.
 
Element operator()(Int_t i) const
 
virtual const Int_t * GetRowIndexArray() const
 
virtual TMatrixTBase< Element > & InsertRow(Int_t row, Int_t col, const Element *v, Int_t n=-1)
Insert in row rown, n elements of array v at column coln.
 
virtual const Element * GetMatrixArray() const
 
virtual const Int_t * GetColIndexArray() const
 
void Rank1Update(const TVectorT< Element > &vec, Element alpha=1.0)
Perform a rank 1 operation on the matrix: A += alpha * v * v^T.
 
void operator*=(Element val)
Multiply every element of the sub matrix by val .
 
void operator+=(Element val)
Add val to every element of the sub matrix.
 
void operator=(Element val)
Assign val to every element of the sub matrix.
 
virtual const Element * GetMatrixArray() const
 
virtual TMatrixTBase< Element > & ResizeTo(Int_t nrows, Int_t ncols, Int_t=-1)
Set size of the matrix to nrows x ncols New dynamic elements are created, the overlapping part of the...
 
virtual TMatrixTBase< Element > & ResizeTo(Int_t nrows, Int_t ncols, Int_t=-1)
Set size of the matrix to nrows x ncols New dynamic elements are created, the overlapping part of the...
 
virtual const Element * GetMatrixArray() const
 
Element * GetMatrixArray()
 
static constexpr double ms
 
Short_t Max(Short_t a, Short_t b)
 
Short_t Min(Short_t a, Short_t b)
 
Long64_t BinarySearch(Long64_t n, const T *array, T value)