00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef PS_SPARSE_H
00010 #define PS_SPARSE_H
00011
00012
00013
00014
00015
00016 typedef struct
00017 {
00018 double paramDelta;
00019 double paramMin;
00020 double paramMax;
00021 }
00022 psSparseConstraint;
00023
00024
00025 typedef struct
00026 {
00027 psVector *Aij;
00028 psVector *Bfj;
00029 psVector *Qii;
00030 psVector *Si;
00031 psVector *Sj;
00032 int Nelem;
00033 int Nrows;
00034 }
00035 psSparse;
00036
00037
00038
00039
00040 typedef struct
00041 {
00042 psSparse *sparse;
00043 psImage *Bij;
00044 psImage *Tjj;
00045 psVector *Gj;
00046 int Nrows;
00047 int Nborder;
00048 }
00049 psSparseBorder;
00050
00051
00052 psSparse *psSparseAlloc(int Nrows, int Nelem);
00053
00054
00055
00056 bool psSparseMatrixElement(psSparse *sparse,
00057 int i, int j,
00058 float value
00059 );
00060
00061
00062 void psSparseVectorElement(psSparse *sparse,
00063 int i,
00064 float value
00065 );
00066
00067
00068 psVector *psSparseMatrixTimesVector(psVector *output,
00069 const psSparse *matrix,
00070 const psVector *vector
00071 );
00072
00073
00074
00075 bool psSparseResort(psSparse *sparse
00076 );
00077
00078
00079
00080 psVector *psSparseSolve(psVector *output,
00081 psSparseConstraint constraint,
00082 const psSparse *sparse,
00083 int Niter
00084 );
00085
00086
00087 psSparseBorder *psSparseBorderAlloc(psSparse *sparse, int Nborder);
00088
00089 bool psSparseBorderElementT(psSparseBorder *border, int i, int j, float value);
00090
00091 bool psSparseBorderElementB(psSparseBorder *border, int i, int j, float value);
00092
00093 bool psSparseBorderElementG(psSparseBorder *border, int i, float value);
00094
00095 psVector *psSparseBorderLowerProduct (psVector *dG, psSparseBorder *border, psVector *xVec);
00096
00097 psVector *psSparseBorderUpperProduct (psVector *dF, psSparseBorder *border, psVector *yVec);
00098
00099 psVector *psSparseBorderSquareProduct (psVector *dG, psSparseBorder *border, psVector *yVec);
00100
00101 bool psSparseBorderUpperDelta (psSparseBorder *border, psVector *dF);
00102
00103 psVector *psSparseBorderLowerDelta (psVector *Go, psSparseBorder *border, psVector *dG);
00104
00105 bool psSparseBorderMultiply (psVector **fIn, psVector **gIn, psSparseBorder *border, psVector *xVec, psVector *yVec);
00106
00107 bool psSparseBorderSolve(psVector **xFit, psVector **yFit, psSparseConstraint constraint, psSparseBorder *border, int Niter);
00108
00109
00110 #endif