簡介
一開始我完全忘了這套 library,直到其他站上有人問 Numerical Recipes in C++ 這套 library 一些問題 (一開始看到以為是問題的標題,想不到它是某個人維護數值分析用的 library ),由於該 library 從 2003 年 12 月底後就沒再維護了,讓我疑惑了它的正確性,於是才想另這套算是易用的 GSL 可替代。
GNU Scientific Library (GSL) 是套數值分析用的 library,支援的函式種類頗多,合計超過一千種,比剛剛那套好一點的地方是,上次它更新的日期是 2011 年 5 月 < 雖然也一年多沒更新就是了 > ,更新時間長達十餘年 < 從 1996 開始 > ,一開始接觸這套 library 時是拿來做非線性擬合 < 和自己演算法的擬合做比較 >,由於當時資料量不算非常大 < 5 維,1 萬多筆 >,所以跑得過去,沒測過上限 < 沒分析過額外的記憶體配置> 大概落在哪便是,同時筆者也沒針對 GSL 與其他 library 做效能之比較過。
這篇要講的只是在 vs 上設定環境的步驟而已。筆者犯懶,沒心思貼圖,只留文字做筆記。
vs2010 英文版 和 vs2010 中文版在 IDE 配置上有所差異,筆者手邊為中文版,另路徑也請自行對照。
[1] download and setup
1.1 Complete package, except sources
1.2 Sources
上面兩個下載並安裝。
[2] vs命令提示字元操作
2.1 切到 C:\Program Files\GnuWin32\lib < 安裝目錄 \ lib >
2.2 輸入以下指令
lib /machine:i386 /def:libgsl.def
lib /machine:i386 /def:libgslcblas.def
將產生二個 .lib , x64 環境編譯參數需改成 /machine:x64
2.3 關閉 vs 命令提示字元
[3] 複製
3.1
C:\Program Files\GnuWin32\bin\libgsl.dll
C:\Program Files\GnuWin32\bin\libgslcblas.dll
copy to
C:\Program Files\Microsoft Visual Studio 10.0\VC\Bin
3.2
C:\Program Files\GnuWin32\include\gsl
copy to
C:\Program Files\Microsoft Visual Studio 10.0\VC\include
3.3
C:\Program Files\GnuWin32\lib\*.lib
copy to
C:\Program Files\Microsoft Visual Studio 10.0\VC\lib
[4] IDE 環境設置
4.1
專案->屬性->組態屬性->C/C++->一般
「其他 Include 目錄」 : "C:\Program Files\Microsoft Visual Studio 10.0\VC\include\gsl"
輸入完按確定後,最後會多%(AdditionalIncludeDirectories),正常。
4.2
專案->屬性->組態屬性->連結器->一般
「其他程式庫目錄」:
"C:\Program Files\Microsoft Visual Studio 10.0\VC\lib"
輸入完按確定後,最後會多 %(AdditionalLibraryDirectories),正常。
4.3
專案->屬性->組態屬性->連結器->輸入
「其他相依性」:libgslcblas.lib;libgsl.lib;.....
加在最前面,在 vs 底下可用 #pragma comment(lib, ...) 相關指令。
[5] 測試程式碼
這是簡單線性迴歸的測試碼,
- /**
- * @file gsl_sample.c
- * @brief gnu science library sample
- * @author EdisonX < Edison.Shih >
- * @date 2012.7.13
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <gsl_fit.h>
- int main()
- {
- size_t n = 8;
- double cov00, cov01, cov11;
- double c0, c1, sumsq;
- const double x[] = { 254,508,762,1016,1269,1523,1777,2031};
- const double y[] = { 46720,72537,85964,93631,98264,101299,103388,104888};
- gsl_fit_linear(x, 1, y, 1, n, &c0, &c1, &cov00, &cov01, &cov11, &sumsq);
- printf("c0 = %lf\n", c0);
- printf("c1 = %lf\n", c1);
- printf("cov00 = %lf\n", cov00);
- printf("cov01 = %lf\n", cov01);
- printf("cov11 = %lf\n", cov11);
- printf("sumsq = %lf\n", sumsq);
- getchar();
- return 0;
- }
執行結果
c0 = 55535.112843
c1 = 28.710076
cov00 = 55900084.547125
cov01 = -38859.479859
cov11 = 34.012674
sumsq = 552150182.770255
顯示結果為 Y = c0 + c1X,和 excel 跑出來的一模一樣。關於其他變數的解釋、再擴展到 p-value , f-value ,就要念統計學了,這裡不是本文重點,就不再深入解釋。
[6] 其他配置模式
上述配置模式只是其中一種,在不同需求下,include path , lib path 可設不同,總之就是要找得到就是了。要 release 給 client 時需把 dll, lib 也附上 (或選擇 MT 編譯) ,
另上述配置方式是「每次開新專案,都要設一次」。若希望每次開新專案都自動加入這些 include path , lib path 的話...
我懶了,有興趣去查一下 IDE 怎麼用,提示是在 專案->屬性->組態屬性->Visual C++,其他的改天再寫。
留言列表