数値計算ライブラリLAPACKはiOS標準で使えた

数値計算用ライブラリで有名なLAPACKですが、iOSではSDKフレームワークをリンクするだけで使えるようになります。個人的には数値計算はまったくのノーマークだったので驚きました。

準備

プロジェクトにAccelerate.frameworkを追加。

で、インポート。

#import <Accelerate/Accelerate.h>

準備終わりです。

最小二乗問題を解く

動くことを確認するために適当な場所にLAPACKを呼び出すコードを書いてみましょう。ここでは例として3点(1,1)(2,4)(3,7)についての最小二乗問題を問いています。結果は当然y = 3 x - 2となるので、a = 3 b = -2となるはずです。

- (void)leastSquare
{
     const int M = 3;
     const int N = 2;
     __CLPK_complex A[M*N], b[M], work[M+N];
     long m=M,n=N,lda=M,ldb=M,info,ldw=M+N, nrhs=1;

     A[0].r = 1.0f,  A[3].r = 1.0f;
     A[1].r = 2.0f,  A[4].r = 1.0f;
     A[2].r = 3.0f,  A[5].r = 1.0f;

     b[0].r = 1.0f;
     b[1].r = 4.0f;
     b[2].r = 7.0f;

     cgels_("N",&m, &n, &nrhs, A, &lda, b, &ldb, work, &ldw, &info);
     NSLog(@"a=%f, b=%f\n",b[0].r,b[1].r);
}

CLAPACKと異なるのは__CLPK_complexを使って複素数を与えることができるようです。今回は使っていませんが。

LAPACKなどのライブラリを使うときによくあるのは、コンパイルがうまくいかないとかリンクがうまくいかないといった導入時点でのつまずきですが、OSが標準でサポートしてくれているためそういった点でつまずくことはほぼありません。

インターフェース自体は従来のCLAPACKとほとんど変わりませんし、LAPACK自体のリソースはそれなりに存在するので十分使えそうです。