12345678910111213141516171819202122232425262728293031323334353637383940 |
- // This only works on MAC ...
- #ifdef __APPLE__
- #include "svd.h"
- #include <Accelerate/Accelerate.h>
- #include <cstdlib>
- #include <cstdio>
- bool igl::svd3x3(double * a, double * u, double * s, double * vt)
- {
- /* Locals */
- int m = 3, n = 3, lda = 3, ldu = 3, ldvt = 3, info, lwork;
- double wkopt;
- double* work;
- /* Local arrays */
- /* iwork dimension should be at least 8*min(m,n) */
- int iwork[8*3];
- //double s[3], u[3*3], vt[3*3];
- //double a[3*3] = {8,3,4,1,5,9,6,7,2};
- /* Query and allocate the optimal workspace */
- lwork = -1;
- dgesdd_(
- "Singular vectors",
- &m, &n, a, &lda, s, u, &ldu, vt, &ldvt, &wkopt, &lwork, iwork, &info);
- lwork = (int)wkopt;
- work = (double*)malloc( lwork*sizeof(double) );
- /* Compute SVD */
- dgesdd_(
- "Singular vectors",
- &m, &n, a, &lda, s, u, &ldu, vt, &ldvt, work, &lwork, iwork, &info );
- /* Check for convergence */
- if( info > 0 )
- {
- printf("The algorithm computing SVD failed to converge.\n" );
- return false;
- }
- /* Free workspace */
- free( (void*)work );
- return true;
- }
- #endif
|