東京海洋大産学官連携研究員/技術コンサルタント 高須 知二 Tomoji TAKASU RTK-GPS測位の基礎と プログラミング (3) Basics of RTK-GPS Positioning and Its Programing 東京海洋大産学官連携研究員/技術コンサルタント 高須 知二 Tomoji TAKASU
内容 行列演算ライブラリ BLASS LAPACK C→Fortran呼び出し法 可変長行列・ベクトル 最小二乗法解法 行列内部表現
行列演算ライブラリ (1) メリット 実行速度が速い (数倍~数10倍) 信頼性が高い コードを書かなくて良い デメリット 使うのが面倒 (使いこなしが大変) make時にライブラリが必要(可搬性)
行列演算ライブラリ (2) BLAS 基礎行列演算: 代入、内積、ノルム、加減算、乗算、除算 LAPACK 線型方程式(連立一次方程式) 最小二乗、固有値分解、特異値分解
BLAS (1) Level1 : y←ax+y...(ベクトル間) Level2 : y←aAx+by...(行列-ベクトル) Level3 : C←aAB+bC...(行列-行列) 関数名 : xAAAA (x : S=単精度実数, D=倍精度実数 C=単精度複素数, Z=倍精度複素数)
BLAS (2) 主要ルーチン DGEMM : C←aA*B*+bC プロトタイプ DGEMM(char *transa, char *transb, int* m, int *n, int *k, double *alpha, double *a, int *lda, double *b, int *ldb, double * beta, double *c, int *ldc);
LAPACK (1) ドライバルーチン 個別ルーチン 補助ルーチン
LAPACK (2) DGESV:線形方程式 DGELS:最小二乗
C→Fortran呼び出し方法 関数名置換 GEMM→gemm_() (GCC) 引数: すべてポインタ(参照)渡し。 (値渡しはできない) リンク時オプション: ライブラリ指定 -llapack -lblas (GCC)
可変長行列/ベクトル 標準C(89) {double *a=malloc(sizeof(double)*n*m); ...; b=a[i+n*j]; ... free(a);} ALLOCA (非標準) {double *a=alloca(sizeof(double)*n*m); ...; b=a[i+n*j]; ...} C99 {double a[n][m]; ...; a[i][j]; ...} (Row-Major)
最小二乗法解法 (1) 正規方程式 計画行列QR分解
最小二乗法解法 (2) QR分解 修正Gram-Shmidt Householder変換 Givens-Rotation 逐次改良
(a[i+j*n]:Column-Major) 行列内部表現 (1) FORTRAN/MATLAB (BLAS/LAPACK) C Index 1-ORIGIN 0-ORIGIN Memory Order n n m m Column-Major Row-Major Access to Member A[i][j] (a[i+j*n]:Column-Major) A(i,j) (i=1,2,...n,j=1,2,...m) (i=0,1,...n-1,j=0,1,...m-1)
行列内部表現 (2) BLAS/LAPACK互換性 標準C(89)サポート (可搬性) メモリ確保用ライブラリ : A=mat(n,m) Column-Major Order (Fortran形式) 行列要素参照 : A[i+j*n]