svd.cpp 1012 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. #include "svd.h"
  2. #include <cstdlib>
  3. #include <Accelerate/Accelerate.h>
  4. #include <cstdio>
  5. bool igl::svd3x3(double * a, double * u, double * s, double * vt)
  6. {
  7. /* Locals */
  8. int m = 3, n = 3, lda = 3, ldu = 3, ldvt = 3, info, lwork;
  9. double wkopt;
  10. double* work;
  11. /* Local arrays */
  12. /* iwork dimension should be at least 8*min(m,n) */
  13. int iwork[8*3];
  14. //double s[3], u[3*3], vt[3*3];
  15. //double a[3*3] = {8,3,4,1,5,9,6,7,2};
  16. /* Query and allocate the optimal workspace */
  17. lwork = -1;
  18. dgesdd_(
  19. "Singular vectors",
  20. &m, &n, a, &lda, s, u, &ldu, vt, &ldvt, &wkopt, &lwork, iwork, &info);
  21. lwork = (int)wkopt;
  22. work = (double*)malloc( lwork*sizeof(double) );
  23. /* Compute SVD */
  24. dgesdd_(
  25. "Singular vectors",
  26. &m, &n, a, &lda, s, u, &ldu, vt, &ldvt, work, &lwork, iwork, &info );
  27. /* Check for convergence */
  28. if( info > 0 )
  29. {
  30. printf("The algorithm computing SVD failed to converge.\n" );
  31. return false;
  32. }
  33. /* Free workspace */
  34. free( (void*)work );
  35. return true;
  36. }