2008-10-16

敗入 HP LP2475w

一直想要入手寬螢幕,本來只是想看看22吋的,畢竟比較便宜。Benq的只要一萬二左右,不過是TN面板,有先天上的限制,例如可是角度不大。好死不死,剛好在PCDVD看到有人發起團購這台螢幕,又是IPS面板的,就叫小明一起加入敗家的行列啦。

螢幕在昨天到手,免不了想要來個開箱文,只是照片拍了,卻懶得發了,直接看結果吧。
要詳細的,到小明那邊看吧。

在LAB原本是使用19吋雙螢幕,一個是自己的 Benq Fp93v,一個是實驗室去年購入的 Benq 忘了型號的。其實雙螢幕工作還滿方便的,一個螢幕寫程式,另一個螢幕查詢資料,也可以遠端控制NB的linux 系統。

這台螢幕有滿多介面的,有兩個DVI、一個HDMI、一個Display Port、六個USB port、AV端子。如果有兩種輸入,還可以用子母畫面,將來不就可以一邊看電視,一邊用電腦了。

今天用了一天,還不怎麼習慣,不過爽度倒是很高。中午吃飯放個電影來看,也是一種大大的享受。

螢幕 + 好打的鍵盤 + 好靠的護腕 + 好用的滑鼠


工作環境,雙螢幕真是好用啊



(繼續閱讀...)

C 呼叫 Matlab 的 function

要將程式的結果用Matlab畫出圖形來,所以也稍微研究一下。
主要是透過Matlab engine 來呼叫 Matlab 提供的函式。

其實不只可以呼叫Matlab來畫圖,也可以直接呼叫 Matlab 提供的數學函式來運算,只是速度有沒有比較快就不知道了,沒有實際去測試過。

【環境設定】
如果是用Visual Studio來寫這樣子的程式的話,要先設定一些專案的屬性

Include
{MATLAB_PATH}\extern\include
{MATLAB_PATH}\extern\include\win32
{MATLAB_PATH}\simulink\win32
Lib
{MATLAB_PATH}\lib\win32\microsoft
{MATLAB_PATH}\lib\win32\
連結器->命令列
libeng.lib libmat.lib libmx.lib libmex.lib

{MATLAB_PATH} 是安裝Matlab 的路徑

【標頭檔】
要 #include "engine.h"

【撰寫程式】
用Matlab 提供的範例程式,這是一個畫出加速度的圖

Engine *ep;
mxArray *T = NULL;

double time[10] = { 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0 };

if (!(ep = engOpen("\0"))) {
fprintf(stderr, "\nCan't start MATLAB engine\n");
return EXIT_FAILURE;
}

T = mxCreateDoubleMatrix(1, 10, mxREAL);
memcpy((void *)mxGetPr(T), (void *)time, sizeof(time));

engPutVariable(ep, "T", T);

engEvalString(ep, "D = .5.*(-9.8).*T.^2;");

engEvalString(ep, "plot(T,D);");
engEvalString(ep, "title('Position vs. Time for a falling object');");
engEvalString(ep, "xlabel('Time (seconds)');");
engEvalString(ep, "ylabel('Position (meters)');");

mxDestroyArray(T);
engClose(ep);


宣告Matlab engine 以及會用到的變數
Engine *ep;
mxArray *T = NULL;


確定Matlab engine開啟成功
if (!(ep = engOpen("\0"))) {
fprintf(stderr, "\nCan't start MATLAB engine\n");
return EXIT_FAILURE;
}


建立Matlab的陣列,mxCreateDoubleMatrix(mwSize m, mwSize n, mxComplexity ComplexFlag);建立 m * n 的陣列,看是要 real(mxREAL) 或者 complex(mxCOMPLEX)
如果只是要一個單純的變數,mxCreateDoubleMatrix(1, 1, mxREAL)就可以了。
T = mxCreateDoubleMatrix(1, 10, mxREAL);


將數值複製給剛剛宣告的變數
memcpy((void *)mxGetPr(T), (void *)time, sizeof(time));


將變數T傳給Matlab的變數
第二個變數 "T" 是在 Matlab 所使用的變數
第三個變數 T 是在 C 裡面用的變數
engPutVariable(ep, "T", T);


執行 Matlab 的指令,第二個變數是要在 Matlab 要執行的指令
所以看想要在Matlab 做什麼動作,畫圖、數學運算,都可以在這邊進行。
engEvalString(ep, "Matlab 的指令");
engEvalString(ep, "D = .5.*(-9.8).*T.^2;");
engEvalString(ep, "plot(T,D);");
engEvalString(ep, "title('Position vs. Time for a falling object');");
engEvalString(ep, "xlabel('Time (seconds)');");
engEvalString(ep, "ylabel('Position (meters)');");


最後,清空記憶體以及關閉 engine
mxDestroyArray(T);
engClose(ep);


參考資料
Calling MATLAB software from C

(繼續閱讀...)