看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《inanity (陰晴圓缺)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : C++ : 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) : 問題(Question): : 看不懂網路上的程式碼,尤其是在while迴圈內外都有一個kappa變數,不知道該怎樣解釋 : 餵入的資料(Input): 看起來 input 有這些 (假設 type 都是 double) scalar(double): mu_s, mu_m, hlp, k_c, th_c, sv_c, ro_c, n_sim array(double[]): v, j, ky, kv, y pointer(double*): v_pre 在 c 裡 pointer 可以指到 array 的某個元素 例如 v_it 是一個 pointer,v_it = v 表示 v_it 指到 v 這個 array 的開頭 然後因為 c 的 index 是從 0 開始算的,所以 *v_it 就是 v[0] 之後 v_it++ 表示 v_it 現在指向下一個了 (所以是 v[1]) 所以要改成 matlab 主要就是下面幾點: * 把 c 的 array 改成 matlab 的 vector,pointer 改成 int c version matlab version v_it = v v_it = 1 *v_it v(v_it) v_it++ v_it = v_it + 1 * matlab 的 index 是從 1 開始算,跟 c 從 0 開始算會差一個 * v_pre 在 c 裡應該是指向 v 的某個元素 在 matlab 裡要先算出是那一個 * pow(a, b) -> a^b * gsl_ran_gaussian,在 matlab 裡要找到相同功能的函式取代 (下面的 code 我是用 randn,要確認一下是不是完全相同) : 預期的正確結果(Expected Output): : 錯誤結果(Wrong Output): : 程式碼(Code):(請善用置底文網頁, 記得排版) : #include<math.h> : #include "bayes.h" : kappa1 = 1.0/pow(mu_s,2.0); : kappa2 = mu_m/pow(mu_s,2.0); : v_it=v; j_it=j; ky_it=ky; kv_it=kv; y_it=y; : while(v_it<v_pre) { : hlp = *v_it++; : e_v = ((*v_it) - hlp - k_c * (th_c - hlp) - (*kv_it)*(*j_it))... : /sqrt(sv_c); : e_y = (*y_it) - (*ky_it)*(*j_it) - ro_c*e_v; : kappa2 += e_y/(1.0 - pow(ro_c,2.0))/hlp; : kappa1 += 1/hlp/(1.0 - pow(ro_c,2.0)); : ++j_it; ++ky_it; ++kv_it; ++y_it; : } : hlp = *v_it; : e_y = (*y_it) - (*ky_it)*(*j_it); : kappa2+=e_y/hlp; : kappa1+=1/hlp; : kappa1=1/kappa1; : mu_c = gsl_ran_gaussian(rv_g,sqrt(kappa1))+ kappa1 * kappa2; : Emu += mu_c/double(nsim); kappa1 = 1.0/(mu_s^2.0); kappa2 = mu_m/(mu_s^2.0); v_it = 1; j_it = 1; ky_it = 1; kv_it = 1; y_it = 1; while v_it < v_pre hlp = v(v_it); v_it = v_it + 1; e_v = v(v_it) - hlp - k_c*(th_c-hlp) - kv(kv_it)*j(j_it)/sqrt(sv_c); e_y = y(y_it) - ky(ky_it)*j(j_it) - ro_c*e_v; kappa2 = kappa2 + e_y/(1.0 - (ro_c^2.0))/hlp; kappa1 = kappa1 + 1/hlp/(1.0 - (ro_c^2.0)); j_it = j_it + 1; ky_it = ky_it + 1; kv_it = kv_it + 1; y_it = y_it + 1; end hlp = v(v_it); e_y = y(y_it) - ky(ky_it)*j(j_it); kappa2 = kappa2 + e_y/hlp; kappa1 = kappa1 + 1/hlp; kappa1 = 1/kappa1; mu_c = sqrt(kappa1)*randn(1) + kappa1*kappa2; Emu = Emu + mu_c/double(nsim); 我照著翻而已,沒測過 加減參考吧... : 補充說明(Supplement): : 小弟我學的是MATLAB,所以對C++不熟,想要把這個程式碼改成MATLAB語言 : 如果板友對這個程式碼還需要其他補充資料,請告知 : 謝謝各位大大 : PS 這是ERAKER 2003年MCMC的程式碼 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.30.49
VictorTom:太強了~~拜....<(_ _)> 05/05 00:49