在利用C語言編程,經常調用其他的軟件包,其中lapack,blas庫是最常用的兩個庫,這里講下在linux系統下,C語言編程如何調用這兩個庫:
1.首先講下blas庫的調用,這里以兩個向量內積函數為例:
#include <stdio.h> #include <math.h> double ddot_(int *,double *,int *,double *,int *); int main() { int N=2, INCX=1, INCY=1; double X[2]={1.0,1.0}; double Y[2]={2.0,2.0}; double re; re=ddot_(&N, X, &INCX, Y, &INCY); printf("the result is:%f\n", re); return 0; }
編譯生成目標文件:
gcc -c testddot.c -o testddot.o
生成可執行文件:
gcc -o testddot testddot.o -lblas -lgfortran
得到結果:
the result is:4.000000
注意到:blas庫是用gfortran寫的,因此需要用到gfortran庫來生成可執行文件,且需要鏈接blas庫的路徑,由於我把blas庫放在了系統默認路徑下,因此這里只需要-lblas即可,否則,需要寫出blas庫的路徑。
2.下面講下lapack庫的調用方法,這里以求解線性方程組為例子。
#include <stdio.h> #include"lapacke.h" #define M 2 #define N 2 int main() { int i, j, n=N, m=M; int info, IPIV[N]; double A[M * N]= { 1, 2, 4, 2}; double B[M*N] = {5, 4, 2.5, 2}; dgesv_(&n, &n, A, &n, IPIV, B, &n, &info); for(j=0; j< 2*N ;j++) printf("%f\t", B[j]); printf("\n"); return 0; }
編譯生成目標文件:
gcc -o test_dgesv.o -c test_dgesv.c
生成可執行文件:
gcc -o test_dgesv test_dgesv.o -llapack -lblas -lm -lgfortran
運行程序:
./test_dgesv
結果如下:
1.000000 1.000000 0.500000 0.500000
注意:blas和lapack中的代碼都是基於fortran來寫的,fortran中的矩陣是按列存儲,而C語言中的矩陣是按行存儲的。編程序的時候一定要記住這點
