29 # define _USE_MATH_DEFINES
38 #define SVD_MAX_ITERATIONS 40
46 ZeroThreshold_=DEFAULT_DOUBLE_ZERO_THRESHOLD;
56 Compute(M, ZeroThreshold);
59 #define PYTHAG(a,b) (fabs(a) > fabs(b) ? \
60 fabs(a)*sqrt(1.0+(fabs(b)/fabs(a))*(fabs(b)/fabs(a))) : \
61 (fabs(b) > 0 ? fabs(b)*sqrt(1.0+(fabs(a)/fabs(b))*(fabs(a)/fabs(b))) : 0.0))
63 #define MAX(a,b) ((a) > (b) ? (a) : (b))
65 #define SIGN(a,b) ((b) >= 0.0 ? fabs(a) : -fabs(a))
74 ZeroThreshold_ = ZeroThreshold;
77 double **a=U_.GetDataArray1(), **v=VT_.GetDataArray1();
78 double *w=S_.GetData()-1;
79 int flag=0, i=0, its=0, j=0, jj=0 , k=0, l=0, nm=0;
80 double c=0.0, f=0.0, h=0.0, s=0.0, x=0.0, y=0.0, z=0.0;
81 double norma=0.0, g=0.0, sc=0.0;
84 for (i=1; i<=3; i++) {
92 for (k=i; k<=3; k++) {
103 for (j=l; j<=3; j++) {
104 for (s=0.0,k=i; k<=3; k++)
105 s += a[k][i]*a[k][j];
108 a[k][j] += f*a[k][i];
121 for (k=l; k<=3; k++) {
123 s += a[i][k]*a[i][k];
126 g = -SIGN(sqrt(s),f);
132 for (j=l; j<=3; j++) {
133 for (s=0.0,k=l; k<=3; k++)
134 s += a[j][k]*a[i][k];
143 norma=MAX(norma,(fabs(w[i])+fabs(tmp[i])));
145 for (i=3; i>=1; i--) {
149 v[i][j]=(a[i][j]/a[i][l])/g;
150 for (j=l; j<=3; j++) {
151 for (s=0.0,k=l; k<=3; k++)
152 s += a[i][k]*v[j][k];
154 v[j][k] += s*v[i][k];
164 for (i=3; i>=1; i--) {
173 for (j=l; j<=3; j++) {
174 for (s=0.0, k=l; k<=3; k++)
175 s += a[k][i]*a[k][j];
178 a[k][j] += f*a[k][i];
189 for (k=3; k>=1; k--) {
190 for (its=1; its<=SVD_MAX_ITERATIONS; its++) {
194 if (fabs(tmp[l])+norma == norma) {
200 if (fabs(w[nm])+norma == norma)
206 for (i=l; i<=k; i++) {
208 if (fabs(f)+norma != norma) {
215 for (j=1; j<=3; j++) {
234 if (its == SVD_MAX_ITERATIONS) {
235 BIASERR(
"No convergence in "<<SVD_MAX_ITERATIONS<<
" iterations");
244 f=((y-z)*(y+z)+(g-h)*(g+h))/(2.0*h*y);
246 f=((x-z)*(x+z)+h*((y/(f+SIGN(g,f)))-h))/x;
248 for (j=l; j<=nm; j++) {
262 for (jj=1; jj<=3; jj++) {
277 for (jj=1; jj<=3; jj++) {
293 i = (fabs(S_[0]) < fabs(S_[1])) ? 1 : 0;
294 if (fabs(S_[i]) < fabs(S_[2]))
298 if (fabs(S_[1]) < fabs(S_[2]))
301 if (res==0) Decomposed_=
true;
Subscript num_cols() const
int Compute(const Matrix< double > &M, double ZeroThreshold=DEFAULT_DOUBLE_ZERO_THRESHOLD)
set a new matrix and compute its decomposition.
Subscript num_rows() const