MeVisLabToolboxReference
FMEwork/Release/Sources/Shared/DTICalculator/DTICalculator.h
Go to the documentation of this file.
00001 // **InsertLicense** code
00002 //----------------------------------------------------------------------------------
00004 
00013 //----------------------------------------------------------------------------------
00014 
00015 #ifndef __DTICalculator__H_
00016 #define __DTICalculator__H_
00017 
00018 #include "IDTICalculator.h"
00019 
00020 
00021 #define DEFINE_DIM(DIM)                                        \
00022 const MLuint32 DTICalculator<DIM>::ms_Dim         = DIM;            \
00023 const MLuint32 DTICalculator<DIM>::ms_SymmTensDim = SYMM_MAT_SIZE(DIM)
00024 
00025 #define DEFINE_EPSILONS(DIM)                                        \
00026 const double DTICalculator<DIM>::m_sEpsilonRel  = 1.0e-00;  \
00027 const double DTICalculator<DIM>::m_sEpsilonAbs  = 0.0e-08
00028 
00029 template<MLuint32 DIM>
00030 class DTICalculator : public IDTICalculator
00031 {
00032 
00033 public:
00034 
00035     DTICalculator();
00036     virtual ~DTICalculator();
00037 
00038     virtual void DeleteDTICalculator ();
00039 
00040     DTICalculator(const DTICalculator& calcObj);
00041     DTICalculator& operator=(const DTICalculator& calcObj);
00042 
00043     virtual MLuint32 getDimension() const;
00044 
00045 
00046     virtual Error_Type setGradients(const double **aGradients, const MLuint32 lNrOfGradients);
00047     virtual MLuint32 getNrOfGradients() const;
00048 
00051     virtual double getTensorError(const double *pLNNorm, const MLuint32 lNrOfGradients);
00052 
00053     virtual const double* calcDiffusionTensor(const double *pLNNorm);
00054 
00055     virtual Error_Type eigenAnaly();
00056     virtual Error_Type eigenAnaly(double regularizationParam);
00057     virtual const double* getEigenvalues() const;
00058     virtual const double* getEigenvectors() const;
00059 
00060 
00061 private:
00062 
00063     static const MLuint32 ms_SymmTensDim; //(DIM*(DIM+1))/2;
00064 
00065     static const double m_sEpsilonRel;
00066     static const double m_sEpsilonAbs;
00067 
00068     float *m_pGradientMem;
00069     float *m_pGradPseudoInvMem;
00070     float *m_aGradPseudoInv[MLMISCMATH_SYMM_MAT_SIZE(DIM)];
00071 
00072     double m_aEigenvalue[DIM];
00073     double m_aEigenvector[DIM*DIM];
00074     double m_aDiffusionTensor[MLMISCMATH_SYMM_MAT_SIZE(DIM)];
00075     double m_aOriginalDiffusionTensor[MLMISCMATH_SYMM_MAT_SIZE(DIM)]; // remains equal after eigenAnaly() !!!!!!!!
00076 
00077     MLuint32 m_lNrOfGradients;
00078 
00079 };
00080 
00081 
00082 
00083 
00084 #endif