98 void svd22(
const double A[4],
double U[4],
double S[2],
double V[4])
105 double B0 = A00 + A11;
106 double B1 = A00 - A11;
107 double B2 = A01 + A10;
108 double B3 = A01 - A10;
110 double PminusT = atan2(B3, B0);
111 double PplusT = atan2(B2, B1);
113 double P = (PminusT + PplusT) / 2;
114 double T = (-PminusT + PplusT) / 2;
116 double CP = cos(P), SP = sin(P);
117 double CT = cos(T), ST = sin(T);
131 double CPmT = cos(P-T), SPmT = sin(P-T);
133 if (fabs(CPmT) > fabs(SPmT))
140 double CPpT = cos(P+T), SPpT = sin(P+T);
142 if (fabs(CPpT) > fabs(SPpT))
148 double e = (C0 + C1) / 2;
149 double f = (C0 - C1) / 2;
229 double *Lmin,
double *Lmax)
233 double B0 = A00 + A11;
234 double B1 = A00 - A11;
235 double B2 = A01 + A10;
236 double B3 = A01 - A10;
238 double PminusT = atan2(B3, B0);
239 double PplusT = atan2(B2, B1);
241 double P = (PminusT + PplusT) / 2;
242 double T = (-PminusT + PplusT) / 2;
246 double CPmT = cos(P-T), SPmT = sin(P-T);
248 if (fabs(CPmT) > fabs(SPmT))
255 double CPpT = cos(P+T), SPpT = sin(P+T);
257 if (fabs(CPpT) > fabs(SPpT))
263 double e = (C0 + C1) / 2;
264 double f = (C0 - C1) / 2;
void svd_sym_singular_values(double A00, double A01, double A11, double *Lmin, double *Lmax)
void svd22(const double A[4], double U[4], double S[2], double V[4])