added possibility to print sparse vector/matrix with user-defined precision
authorshahoian <shahoian@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 24 Jun 2010 10:13:34 +0000 (10:13 +0000)
committershahoian <shahoian@f7af4fe6-9843-0410-8265-dc069ae4e863>
Thu, 24 Jun 2010 10:13:34 +0000 (10:13 +0000)
STEER/AliMatrixSparse.cxx
STEER/AliMatrixSparse.h
STEER/AliVectorSparse.cxx

index 3c5f9ca..f9f94a1 100644 (file)
@@ -25,20 +25,21 @@ AliMatrixSparse::AliMatrixSparse(Int_t sz)
 AliMatrixSparse::AliMatrixSparse(const AliMatrixSparse& src)
   : AliMatrixSq(src),fVecs(0)
 {
-  fVecs = new AliVectorSparse*[fNcols];
+  fVecs = new AliVectorSparse*[src.GetSize()];
   for (int i=GetSize();i--;) fVecs[i] = new AliVectorSparse( *src.GetRow(i));
 }
 
 //___________________________________________________________
 AliVectorSparse* AliMatrixSparse::GetRowAdd(Int_t ir)
 {
-  if (ir>=fNcols) {
+  if (ir>=fNrows) {
     AliVectorSparse** arrv = new AliVectorSparse*[ir+1];
     for (int i=GetSize();i--;) arrv[i] = fVecs[i];
     delete fVecs;
     fVecs = arrv;    
     for (int i=GetSize();i<=ir;i++) fVecs[i] = new AliVectorSparse();
-    fNcols = fNrows = ir+1;
+    fNrows = ir+1;
+    if (IsSymmetric() && fNcols<fNrows) fNcols = fNrows;
   }
   return fVecs[ir];
 }
@@ -48,30 +49,31 @@ AliMatrixSparse& AliMatrixSparse::operator=(const AliMatrixSparse& src)
 {
   if (*this == src) return *this;
   Clear();
-  fNcols = fNrows = src.GetSize();
+  fNcols = src.GetNCols();
+  fNrows = src.GetNRows();
   SetSymmetric(src.IsSymmetric());
-  fVecs = new AliVectorSparse*[fNcols];
-  for (int i=fNcols;i--;) fVecs[i] = new AliVectorSparse( *src.GetRow(i));
+  fVecs = new AliVectorSparse*[fNrows];
+  for (int i=fNrows;i--;) fVecs[i] = new AliVectorSparse( *src.GetRow(i));
   return *this;
 }
 
 //___________________________________________________________
 void AliMatrixSparse::Clear(Option_t*) 
 {
-  for (int i=fNcols;i--;) delete GetRow(i);
+  for (int i=fNrows;i--;) delete GetRow(i);
   delete[] fVecs;
   fNcols = fNrows = 0;
 }
 
 //___________________________________________________________
-void AliMatrixSparse::Print(Option_t*)  const
+void AliMatrixSparse::Print(Option_t* opt)  const
 {
-  printf("Sparse Matrix of size %d %s\n",fNcols,IsSymmetric() ? " (Symmetric)":"");
-  for (int i=0;i<fNcols;i++) {
+  printf("Sparse Matrix of size %d x %d %s\n",fNrows,fNcols,IsSymmetric() ? " (Symmetric)":"");
+  for (int i=0;i<fNrows;i++) {
     AliVectorSparse* row = GetRow(i);
     if (!row->GetNElems()) continue;
     printf("%3d: ",i); 
-    row->Print();
+    row->Print(opt);
   }
 }
 
index 5151851..12898b4 100644 (file)
@@ -24,7 +24,11 @@ class AliMatrixSparse : public AliMatrixSq
   //
   AliVectorSparse* GetRow(Int_t ir)        const {return (ir<fNcols) ? fVecs[ir] : 0;}
   AliVectorSparse* GetRowAdd(Int_t ir);
-
+  //
+  virtual Int_t   GetSize()                            const {return fNrows;}
+  virtual Int_t   GetNRows()                           const {return fNrows;}
+  virtual Int_t   GetNCols()                           const {return fNcols;}
+  //
   void Clear(Option_t* option="");
   void Reset()                            {for (int i=fNcols;i--;) GetRow(i)->Reset();}
   void Print(Option_t* option="")                      const;
@@ -81,6 +85,7 @@ inline Double_t& AliMatrixSparse::operator()(Int_t row,Int_t col)
   //  printf("M: findindexAdd\n");
   if (IsSymmetric() && col>row) Swap(row,col); 
   AliVectorSparse* rowv = GetRowAdd(row);
+  if (col>=fNcols) fNcols = col+1;
   return rowv->FindIndexAdd(col);
 }
 
@@ -98,8 +103,11 @@ inline Double_t AliMatrixSparse::DiagElem(Int_t row) const
 inline Double_t &AliMatrixSparse::DiagElem(Int_t row)
 {
   AliVectorSparse* rowv = GetRowAdd(row);
-  if (IsSymmetric()) return (rowv->GetNElems()>0 && rowv->GetLastIndex()==row) ? 
+  if (row>=fNcols) fNcols = row+1;
+  if (IsSymmetric()) {
+    return (rowv->GetNElems()>0 && rowv->GetLastIndex()==row) ? 
                       rowv->GetLastElem() : rowv->FindIndexAdd(row);
+  }
   else return rowv->FindIndexAdd(row);
   //
 }
index 24aad10..a0e209a 100644 (file)
@@ -17,6 +17,7 @@
 
 #include <string.h>
 #include "AliVectorSparse.h"
+#include <TString.h>
 
 /**********************************************************************************************/
 /* Sparse vector class, used as row of the AliMatrixSparse class                              */
@@ -161,11 +162,17 @@ void AliVectorSparse::SortIndices(Bool_t valuesToo)
 }
 
 //__________________________________________________________
-void AliVectorSparse::Print(Option_t* )  const
+void AliVectorSparse::Print(Option_t* opt)  const
 {
+  TString sopt = opt; sopt.ToLower();
+  int ndig = sopt.Atoi();
+  if (ndig<=1) ndig = 2;
+  sopt = "%2d:%+.";
+  sopt += ndig;
+  sopt += "e |";
   printf("|");
-  for (int i=0;i<fNElems;i++) printf("%2d:%+.2e|",fIndex[i],fElems[i]);
-  printf("|\n");
+  for (int i=0;i<fNElems;i++) printf(sopt.Data(),fIndex[i],fElems[i]);
+  printf("\n");
 }
 
 //___________________________________________________________