http://www.a.mei.titech.ac.jp/~kabe/calcsoft/library/lapack/clapack/usage/index.htmlを参考にfloatの4x4逆行列をAccelerate Frameworkを使って求めてみる。
#import <Accelerate/Accelerate.h> void InvMatrix4x4( __CLPK_real *matrix ) { __CLPK_integer m,n,lda,info,lwork; __CLPK_integer piv[4]; __CLPK_real work[4]; lwork = lda = m = n = 4; sgetrf_(&m, &n, matrix, &lda, piv, &info); sgetri_(&n, matrix, &lda, piv, work, &lwork, &info); }
どの関数使うのか探すときは目眩がしたけど、上記URLのおかげでさくっとできました。
-(void)test { float mat_prime[] = { 1, 2, 0, 5, 0, 1, 0, 0, 3, 0, 1, 0, 5, 4, 3, 1 }; float matrix[16]; memcpy( matrix, mat_prime, sizeof(float)*16 ); InvMatrix4x4(matrix); for ( int i = 0; i < 4; ++i ) { printf("%.2f %.2f %.2f %.2f\n",matrix[i*4],matrix[i*4+1],matrix[i*4+2],matrix[i*4+3]); } }
次は行列xベクターをどう扱うのか探そう。
LU分解を使っていて、行列式が0になる、あるいは0に近い行列では失敗するケースがあります。
infoをチェックすれば、成功したかどうかなどわかるので、必要に応じてエラー処理等は書き足す必要があります。