int main() { array double a[3][3] = {7, 8, 1, 3, 6, 4, 3, 5, 7}; /* m-by-n matrix */ array float b[3][3] = {7, 8, 1, 3, 6, 4, 3, 5, 7}; /* m-by-n matrix */ int m = 3, n = 3; int lmn = min(m,n); array double s[lmn]; array double u[m][m]; array double vt[n][n]; array float fs[lmn]; array float fu[m][m]; array float fvt[n][n]; int status; svd(a, s, NULL, NULL); printf("s =\n%f\n", s); svd(a, s, u, vt); printf("u =\n%f\n", u); printf("s =\n%f\n", s); printf("vt =\n%f\n", vt); printf("u*s*v^t =\n%f\n", u*diagonalmatrix(s)*transpose(vt)); status = svd(b, fs, fu, fvt); if(status ==0) { printf("fu =\n%f\n", fu); printf("fs =\n%f\n", fs); printf("fvt =\n%f\n", fvt); printf("u*s*v^t =\n%f\n", fu*diagonalmatrix(fs)*transpose(fvt)); } else printf("error: numerical error in svd()\n"); }
s = 15.071167 5.471953 0.957939 u = -0.660443 0.704551 0.259659 -0.511773 -0.169318 -0.842271 -0.549458 -0.689158 0.472395 s = 15.071167 5.471953 0.957939 vt = -0.517995 0.430638 0.739075 -0.736603 0.214678 -0.641349 -0.434853 -0.876621 0.206007 u*s*v^t = 7.000000 8.000000 1.000000 3.000000 6.000000 4.000000 3.000000 5.000000 7.000000 fu = -0.660443 0.704551 0.259659 -0.511773 -0.169318 -0.842271 -0.549458 -0.689158 0.472395 fs = 15.071167 5.471953 0.957939 fvt = -0.517995 0.430638 0.739075 -0.736603 0.214678 -0.641349 -0.434853 -0.876621 0.206007 u*s*v^t = 7.000000 8.000000 1.000000 3.000000 6.000000 4.000000 3.000000 5.000000 7.000000