簡介

 

一開始我完全忘了這套 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] 測試程式碼

 

這是簡單線性迴歸的測試碼,

 

Code Snippet
  1. /**
  2. * @file gsl_sample.c
  3. * @brief gnu science library sample
  4. * @author EdisonX < Edison.Shih >
  5. * @date  2012.7.13
  6. */
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <gsl_fit.h>
  10.  
  11. int main()
  12. {
  13.     size_t n = 8;
  14.     double cov00, cov01, cov11;
  15.     double c0, c1, sumsq;
  16.     const double x[] = { 254,508,762,1016,1269,1523,1777,2031};
  17.     const double y[] = { 46720,72537,85964,93631,98264,101299,103388,104888};
  18.  
  19.     gsl_fit_linear(x, 1, y, 1, n, &c0, &c1, &cov00, &cov01, &cov11, &sumsq);
  20.  
  21.     printf("c0      = %lf\n", c0);
  22.     printf("c1      = %lf\n", c1);
  23.     printf("cov00   = %lf\n", cov00);
  24.     printf("cov01   = %lf\n", cov01);
  25.     printf("cov11   = %lf\n", cov11);
  26.     printf("sumsq   = %lf\n", sumsq);
  27.  
  28.     getchar();
  29.     return 0;
  30. }

 

執行結果

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++,其他的改天再寫。

arrow
arrow
    全站熱搜

    edisonx 發表在 痞客邦 留言(0) 人氣()