0022904: Clean up sccsid variables
[occt.git] / src / math / math_SVD.cxx
1 //#ifndef DEB
2 #define No_Standard_RangeError
3 #define No_Standard_OutOfRange
4 #define No_Standard_DimensionError
5 //#endif
6
7 #include <math_SVD.ixx>
8 #include <math_Recipes.hxx>
9
10
11 #include <StdFail_NotDone.hxx>
12 #include <Standard_DimensionError.hxx>
13 #include <Standard_NotImplemented.hxx>
14
15
16 math_SVD::math_SVD (const math_Matrix& A) :
17    U    (1, Max(A.RowNumber(),A.ColNumber()), 1, A.ColNumber()) ,
18    V    (1, A.ColNumber(), 1, A.ColNumber()),
19    Diag (1, A.ColNumber())
20 {
21    U.Init(0.0);
22    RowA = A.RowNumber() ;
23    U.Set(1, A.RowNumber(), 1, A.ColNumber(), A) ;
24    Standard_Integer Error = SVD_Decompose(U, Diag, V) ;
25    Done = (!Error) ? Standard_True : Standard_False ;
26 }
27
28 void math_SVD::Solve (const math_Vector& B,
29                       math_Vector& X,
30                       const Standard_Real Eps) const
31 {
32    StdFail_NotDone_Raise_if(!Done, " ");
33    Standard_DimensionError_Raise_if((RowA != B.Length()) ||
34                                     (X.Length() != Diag.Length()), " ");
35
36    math_Vector BB (1, U.RowNumber()) ;
37    BB.Init(0.0);
38    BB.Set (1, B.Length(), B) ;
39    Standard_Real wmin = Eps * Diag(Diag.Max());
40    for (Standard_Integer I = 1; I <= Diag.Upper(); I++)
41    {
42       if (Diag(I) < wmin) Diag(I) = 0.0 ;
43    }
44    SVD_Solve (U, Diag, V, BB, X) ;
45 }
46
47 void  math_SVD::PseudoInverse (math_Matrix& Result,
48                                const Standard_Real Eps) const
49 {
50    Standard_Integer i, j ;
51
52    StdFail_NotDone_Raise_if(!Done, " ");
53
54    Standard_Real wmin = Eps * Diag(Diag.Max());
55    for (i=1; i<=Diag.Upper(); i++)
56    {
57       if (Diag(i) < wmin) Diag(i) = 0.0 ;
58    }
59
60    Standard_Integer ColA = Diag.Length () ;
61    math_Vector VNorme (1, U.RowNumber()) ;
62    math_Vector Column (1, ColA) ;
63
64    for (j=1; j<=RowA; j++)
65    {
66       for (i=1; i<=VNorme.Upper(); i++) VNorme(i) = 0.0 ;
67       VNorme(j) = 1.0 ;
68       SVD_Solve (U, Diag, V, VNorme, Column) ;
69       for (i=1; i<=ColA; i++) Result(i,j) = Column(i) ;
70    }
71 }
72
73
74 void math_SVD::Dump(Standard_OStream& o) const {
75
76   o << "math_SVD";
77   if(Done) {
78     o << " Status = Done \n";
79   }
80   else {
81     o << " Status = not Done \n";
82   }
83 }
84