svd.cpp 1.0 KB

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