第一篇:MATLAB與C讀書筆記
基于C進行dSPACE仿真的技術路線
dSPACE關聯(lián)于MATLAB的Simulink,由Simulink提供計算模塊,dSPACE提供Realtime Interface(RTI)的形式模塊化輸入輸出端口。MATLAB基于Simulink的Realtime Workshop編譯生成目標機器可執(zhí)行代碼,并下載到dSPACE中執(zhí)行。
C與MATLAB聯(lián)系密切,MATLAB提供了多種利用C實現(xiàn)高效、快速運算編程的方法,并能實現(xiàn)針對不同平臺的可執(zhí)行代碼生成和優(yōu)化。不斷升級完善的Realtime Workshop以及Realtime Workshop Embedded Coder保證了C代碼可以稍作修改即直接載入處理器執(zhí)行運算,并且得到了DO178B、IEC61508認證,在航空航天和國防領域有廣泛應用。配合Simulink的Model Advisor檢查模型代碼,使模型易于改進。MATLAB提供的Model Reference可以將模塊獨立處理,采用增進式代碼修改,適合于大型系統(tǒng)的模塊化設計。
本文需要探討的問題是如何利用大量已有的C文件進行dSPACE仿真。因此,將首先介紹MATLAB中與C有關的External Interfaces和S-Function,然后再根據(jù)這些介紹尋找較為簡捷的實現(xiàn)方案。
1、External Interfaces
提供MATLAB與外部程序和設備進行輸入輸出通訊的接口。
1)Mat文件
MATLAB的數(shù)據(jù)文件即Mat文件,它可以實現(xiàn)數(shù)據(jù)在平臺之間的轉(zhuǎn)移或外部程序與MATLAB的數(shù)據(jù)傳遞。MATLAB提供了一些前綴為mat的函數(shù),可以在C中直接調(diào)用。通過專用的API編譯,Window環(huán)境下為matlabroot bin win32 mexopts *engmatopts.bat,編譯在cmd窗口執(zhí)行。
2)共享庫(Shared Libraries)
Windows環(huán)境下共享庫是動態(tài)鏈接文件,后綴為.dll,用C等編寫,在MATLAB中調(diào)用。利用loadlibrary()和unloadlibrary分別完成動態(tài)鏈接文件的裝載和卸載,裝載完成后可以使用calllib()函數(shù)在MATLAB中調(diào)用動態(tài)庫中函數(shù)。
3)Mex文件
Mex是MATALAB Eexcutable的縮寫,類似于共享庫,Mex文件可以在MATLAB命令行中直接調(diào)用。Mex主要應用于
A、直接使用已經(jīng)編寫的C程序,而不需重新編寫m文件;
B、對運算性能要求較高的應用場合。
MATLAB有四種Mex文件:
1、源Mex文件,用C書寫的代碼;
2、二進制Mex文件,MATLAB中執(zhí)行的動態(tài)鏈接進程;
3、Mex函數(shù)庫,即能夠在MATLAB中使用的API庫;
4、Mex編譯腳本,將源Mex文件轉(zhuǎn)換成二進制Mex文件的MATLAB函數(shù)。
源Mex文件中,需要將原C文件中的main改寫成需要使用的函數(shù)名,源Mex文件一般包括三個部分:gateway進程、計算進程和處理器宏。計算進程即編寫的計算函數(shù),其后,要按規(guī)定格式編寫用于建立gateway進程的mxfunction,主要是變量傳遞和解釋,需調(diào)用mex.h文件。編譯采用mex functionname.c的命令形式,編譯后的函數(shù)可以像眾多MATLAB內(nèi)建函數(shù)一樣直接調(diào)用。
2、MATLAB S-Function
在MATLAB中可以用m文件、C、C++、Ada和Fortran等編寫Simulink模塊,其中C、C++、Ada和Fortran編寫的S-Function以Mex文件的形式進行編譯。
以m文件編寫的S-Function有Level1和Level2之分,其中Level2可以調(diào)用更加豐富的S-Function的API資源,并且支持代碼生成(手動書寫,適合于dSPACE與RTI)。
以C Mex形式編寫的S-Function具有最大的靈活性和功能性,支持面向應用對象編譯(Target Language Compiler TLC)的代碼生成,該代碼自動生成,不需要手動添加編譯文件,可以將算法寫成C Mex的形式,也可以構(gòu)建一個wrapper S-Function去調(diào)用C/C++/Fortran代碼。MATLAB提供了編寫C Mex S-Function的模板文件sfuntmpl_doc.c和用戶界面S-Function Builder。
MATALB還提供一個Legacy Code Tool(繼承代碼工具?)用于創(chuàng)建能夠調(diào)用C和C++的S-Function,同樣支持TLC,但能夠利用的API有限,適用于僅計算輸出而不計算狀態(tài)的Legacy Code。
需要注意的是,C Mex S-Function不支持總線輸入輸出,對模型參考也不完全支持;S-Function Builder則不支持總線輸入輸出、向量、多速率采樣、輸入輸出數(shù)量變化等。除上述以代碼區(qū)分S-Function類型外,S-Function也可以分為Noninlined和Wrapper and Fully Inlined兩種。前者即C Mex S-Function,dSPACE提供的應用說明Implementation Guide主要是針對C Mex S-Function。后者是基于TLC代碼生成,多個文件相互獨立。
1)使用已有的C文件構(gòu)建S-Function
對已經(jīng)存在的C程序文件,在Simulink中有3種方法:
A、Wrapper S-Function。
手寫C S-Function和TLC文件,要求對S-Function的深入了解。
在Wrapper函數(shù)同一般的S-Function一樣,主要有mdlInitializeSizes()、mdlInitializeSampleTimes()、mdlOutputs()、mdlTerminate()等方法,其中在mdlOutputs()方法中調(diào)用已經(jīng)編寫好的C程序,該C程序按照標準C書寫。
完成Wrapper函數(shù)的編寫后,在MATLAB命令窗口運行mex命令編譯即可。
此外還需要編寫TLC文件才能生成RTW代碼,TLC文件基于m編寫,基本的函數(shù)有BlockTypeSetup和Outputs。Wrapper和TLC文件都可以參考MATLAB提供的模板進行編輯。
B、S-Function Builder。
通過GUI界面編輯,自動生成S-Function和TLC文件,不強調(diào)對S-Function的熟練掌握。需要創(chuàng)建聲明已有C文件的庫函數(shù),并在Builder面板的Libraries中指定對應的C文件和需引用的庫文件。此外需要調(diào)整初始化、輸入和輸出等一些參數(shù)。完成配置后,點擊Build按鈕即生成S-Function、Wrapper和TLC三個文件。
C、the Legacy Code Tool。
通過命令在MATLAB Workspace中定義S-Function,無需掌握S-Function的知識。其基本命令如下:
def = legacy_code('initialize');
def.SourceFiles = {'doubleIt.c'};//源C文件
def.HeaderFiles = {'doubleIt.h'};//庫文件
def.SFunctionName = 'legacy_wrapsfcn';//S-Function名稱 def.OutputFcnSpec = 'double y1 = doubleIt(double u1)';def.SampleTime = [-1,0];
legacy_code('sfcn_cmex_generate', def);
legacy_code('compile', def);
legacy_code('sfcn_tlc_generate', def);
通過the Legacy Code Tool與通過S-Function Builder生成的S-Function不同:Builder生成的結(jié)果中,已有的C文件被wrapper函數(shù)調(diào)用,而Legacy Code Tool則直接調(diào)用已有的C文件;通過Builder面板可以定義S-Function的輸入輸出變量名稱,而Legacy Code Tool中僅取默認的y和u。
2)使用C編寫S-Function
S-Function的基本結(jié)構(gòu)是:
#define//函數(shù)名
#include//函數(shù)頭
mdl*()//調(diào)用API方法
#ifdef…endif//尾部聲明
S-Function的API方法均已mdl開頭,如mdlInitializeSizes()。編寫好的S-Function使用mex命令進行編譯。
3、結(jié)論
綜合上述介紹,比較簡單的使用已有C文件進行dSPACE仿真的技術路線有以下3種:
1).C文件→Mex編譯腳本mexfunction→二進制Mex文件(.mexw32)→Simulink S-Function模塊。
2).C文件→the Legacy Code Tool→C S-Function和TLC文件→.mexw32文件→Simulink S-Function模塊。
3).C文件→S-Function Builder→.mexw32文件→Simulink S-Function模塊。
其中,the Legacy Code Tool允許Simulink直接調(diào)用C代碼,比C S-Function易用。當然,C S-Function更加靈活,功能更加豐富。
對于只計算輸出的函數(shù),可以直接利用the Legacy Code Tool。而對于需要計算微分方程的函數(shù),則不能簡單的直接利用原有的C文件,需要考慮是單獨編譯微分方程數(shù)值計算方法,還是使用MATLAB自身的ODE方法。
需要注意的是,dSPACE不支持M/C++/Fortran/Ada編寫的S-Function,因此已有的C文件必須用C編寫。
第二篇:c語言讀書筆記
C語言讀書筆記
——讀《C程序設計》筆記
一學期對《c語言程序與設計》的學習與應用使我對c語言產(chǎn)生了濃厚的興趣。C語言程序與設計是一門實踐性很強的課程,不可能只靠聽課和看書就掌握c語言程序與設計,因此必須十分重視動手編寫程序和上機運行程序能力的培養(yǎng)。所以我自己在課后學習了《C程序設計》中的“結(jié)構(gòu)體”部分,以下為在學習過程中所做的筆記。
一、結(jié)構(gòu)體;
?結(jié)構(gòu)體概述:
結(jié)構(gòu)是一種“構(gòu)造”而成的數(shù)據(jù)類型,在說明和使用之前必須先定義它,也就是構(gòu)造它。
定義一個結(jié)構(gòu)的一般形式為:
struct 結(jié)構(gòu)名
{成員表列};
成員表列由若干個成員組成,每個成員都是該結(jié)構(gòu)的一個組成成分。對每個成員也必須進行類型說明,其形式為:
類型說明符 成員名;
結(jié)構(gòu)名和成員名應該符合標識符的書寫規(guī)定。
?結(jié)構(gòu)體變量的定義
1)先定義結(jié)構(gòu)體,再說明結(jié)構(gòu)變量。
2)在定義結(jié)構(gòu)體類型的同時定義結(jié)構(gòu)變量。
3)直接說明結(jié)構(gòu)變量。
?結(jié)構(gòu)體變量的引用
定義結(jié)構(gòu)體型變量的目的就是為了在后續(xù)程序中引用它。
注意:結(jié)構(gòu)體型變量是一種聚合性變量,可引用的對象有兩個:變量名代表變量的整體,成員名代表變量的各個成員,兩者均可在程序中引用。但應遵守以下規(guī)則:
1)不能將一個結(jié)構(gòu)體變量作為一個整體進行輸入和輸出。
2)如果成員本身又屬于一個結(jié)構(gòu)類型,則要用若干個成員運算符,一級一級地找到最低的一級的成員。只能對最低級的成員進行賦值或存取運算。
3)對成員可以像普通變量一樣進行各種運算(根據(jù)其類型決定可以進行的運算)。?結(jié)構(gòu)體變量的初始化
像數(shù)組一樣,能夠以值列表的方式為結(jié)構(gòu)體的各個分量數(shù)據(jù)進行初始化。初始化時,將所提供的數(shù)據(jù)按照各分量的順序排列,如果結(jié)構(gòu)分量仍是結(jié)構(gòu),則按最低層類型提供數(shù)據(jù)。另外,還可以通過分別賦值的方式為結(jié)構(gòu)變量的各個分量賦值。
二、結(jié)構(gòu)體數(shù)組
數(shù)組的元素也可以是結(jié)構(gòu)體類型的,因此可以構(gòu)成結(jié)構(gòu)體數(shù)組。結(jié)構(gòu)體數(shù)組的每一個元素都是具有相同結(jié)構(gòu)體類型的下標結(jié)構(gòu)體變量。在實際應用中,經(jīng)常用結(jié)構(gòu)體數(shù)組來表示具有相同數(shù)據(jù)結(jié)構(gòu)體的一個群體。
方法和結(jié)構(gòu)變量相似,只需說明它為數(shù)組類型。
三、結(jié)構(gòu)體類型指針
? 指向結(jié)構(gòu)體變量的指針
結(jié)構(gòu)指針變量說明的一般形式為:
Struct 結(jié)構(gòu)名 *結(jié)構(gòu)指針變量名
賦值是把結(jié)構(gòu)變量的首地址賦予該指針變量,不能把結(jié)構(gòu)名賦予該指針變量,而只能將結(jié)構(gòu)體變量賦予該指針變量。
表示結(jié)構(gòu)成員的三種等效形式:
1)結(jié)構(gòu)變量.成員名
2)(*結(jié)構(gòu)指針變量).成員名
3)結(jié)構(gòu)指針變量->成員名
? 指向結(jié)構(gòu)體數(shù)組的指針
指針變量可以指向一個結(jié)構(gòu)數(shù)組,這時結(jié)構(gòu)指針變量的值是整個結(jié)構(gòu)數(shù)組的首地址。結(jié)構(gòu)指針變量也可以指向結(jié)構(gòu)數(shù)組的一個元素,這時結(jié)構(gòu)指針變量的值是該結(jié)構(gòu)數(shù)組元素的首地址。
注意,一個結(jié)構(gòu)指針變量雖然可以用來訪問結(jié)構(gòu)變量或結(jié)構(gòu)數(shù)組元素的成員,但是,不能使它指向一個成員。也就是說,不允許取一個成員的地址來賦予它。
?結(jié)構(gòu)指針作為函數(shù)參數(shù)
用結(jié)構(gòu)變量作為函數(shù)參數(shù)進行整體傳送的最好的辦法就是使用指針,這時,由實參傳向形參的只是地址,從而減小了時間和空間的開銷。
四、動態(tài)內(nèi)存分配
? 動態(tài)存儲分配函數(shù)
為了處理動態(tài)數(shù)據(jù)結(jié)構(gòu),必須在程序的執(zhí)行過程中動態(tài)的分配內(nèi)存。
1)分配內(nèi)存空間函數(shù)malloc
調(diào)用時的一般形式:
(類型說明符*)malloc(size)
2)分配內(nèi)存空間函數(shù)calloc()
調(diào)用時的一般形式:
(類型說明符*)calloc(n,size)
說明:在內(nèi)存動態(tài)存儲區(qū)中分配n塊長度為“size”字節(jié)的連續(xù)區(qū)域。函數(shù)的返回值為該區(qū)域的首地址,其中(類型說明符*)用于強制類型轉(zhuǎn)換。
3)釋放內(nèi)存空間函數(shù)free()
調(diào)用時的一般形式:
Free(void *ptr);
說明:釋放ptr所指向的一塊內(nèi)存空間,ptr是一個任意類型的指針變量,它指向被釋放區(qū)域的首地址,被釋放區(qū)應是由malloc()或calloc()函數(shù)所分配的區(qū)域。
五、注意問題:
① 結(jié)構(gòu)體名和結(jié)構(gòu)體變量時兩個不同的概念,不能混淆。結(jié)構(gòu)體名只能表示一個結(jié)構(gòu)形式,編譯系統(tǒng)并不對它分配內(nèi)存空間。只有當某變量被說明為這種類型的結(jié)構(gòu)時,才能對該變量分配存儲空間。
② 結(jié)構(gòu)指針變量能更方便的訪問結(jié)構(gòu)變量的各個成員,其訪問一般形式為:
(*結(jié)構(gòu)指針變量名).成員名或者為結(jié)構(gòu)指針變量→成員名
③ 字節(jié)對齊的問題,一般為4,具體依編譯器而定。
1一個占N 個字節(jié)的變量,存儲在首地址偏移量為N的n倍的地址上、2結(jié)構(gòu)體變量占的總內(nèi)存大小等于它的成員的數(shù)據(jù)類型最大的n倍
第三篇:c語言讀書筆記
Vc++讀后感
閑來無事,跑來圖書館,突然被一本名叫《致程序員之家論壇的所有會員》的書把我的注意力吸引過去了,于是我用心的讀起來了。下面這些是我做的一些筆記。
應該掌握程序運行的原理與機制:學習VC++6.0 在WINDOWS下編程,就應該了解WINDOWS消息機制。(關于消息機制不用太深入,新手學習一個大概流程就可以了)
掌握編程的思想:這點就比較難了,C++的編程就是面向?qū)ο?,對象的概念一定要清楚。這點重要是多練習自己動手做做小程序。
多動腦,多動手,再加上十分的仔細:關于這點就是一個學習態(tài)度的問題了。勤勞和懶惰都是人天生都有的本性,就看我們選擇那一個了。
在編寫一個程序的時候,要知道為什么要去編它,在程序中的函數(shù)為什么這么調(diào)用,這個程序的內(nèi)存模型是怎樣的?可以這樣說:我們做任何事前都要有目標,有目標才能前進,函數(shù)流程就是一個程序的生命,就像人們血液流動的過程一樣,從心臟出發(fā)經(jīng)過各個臟器,我們要了解的就是經(jīng)過那一些,那一些是主要的臟器,這些臟器是用來干什么的。最終回到那里去。內(nèi)存模型蠻專業(yè)化的詞,不過不用怕,就是數(shù)據(jù)在內(nèi)存客中排列的順序結(jié)構(gòu),誰在前面誰在后面了解就可以了。
程序語言的學習,是一個循序漸進的過程,切忌急功近利
這一點我認為最重要,我們往往想靜心學習一點東西都不是很容易,總是想一口氣吃成個大胖子,這種心態(tài),去學習任何事情都不會成功的,筆者自己也是一樣,經(jīng)常想馬上就學會,最后是什么也學不會。只能一步一步來,天才少,努力的人才多。切忌急功近利。
我們往往會因為不知從何入手而不知不覺中走了彎路,停留于表面,你越是著急,反而越容易走彎路,越是搞不懂,就越是需要我們的耐心,不過我也知道這個說說容易做做難,我的方法是,煩的時候回到原點想想你為什么學習編程,也許會對你好一點。每一個人的情況不同,所以要找對自己最有效果的。
你所得到的答案,經(jīng)常是最終的答案,而不是中間過程。
這一點也很懂要,我們經(jīng)常在論壇上要結(jié)果的人,結(jié)果給我們也沒有用,我們要的是過程,只有我們了解了過程才能寫出自己的結(jié)果。要不我們就永遠沒有結(jié)果。
每個人學習的情況都是不一樣的,所以遇到的問題也是不盡相同,但我們都應該首先嘗試自己是否能夠解決這個問題。我們不要有問題就想到別人,我們要想自己想想可不可以解決,我說的想不是說只想了一次就算數(shù)了,我的想是你一個問題要想好幾次,從不同路角度來看問題,有時候會有突破的,不過一看到難的就去求別人,那是沒用的。
看完這本書,我受益匪淺,這告訴我們做學問就不應該只停留著一本書上,而是多去翻閱一些相類似的書,多擴展一下自己的知識面。
第四篇:Matlab 與線性代數(shù)教案
Matlab 與線性代數(shù)
一、Matlab 入門:
1.啟動、退出、運行: 2.窗口介紹: 3.基本符號: =:賦值符號
[ ]:數(shù)組定義符號 , 區(qū)分列 函數(shù)參數(shù)分隔符;區(qū)分行 取消運行顯示 % 注釋標記
: 具有多種應用功能
4.matlab的變量(區(qū)分大小寫): 預定義變量: ans
pi 相關命令: format(顯示格式 rat long short)
who whos clear
5.M 文件(純文本文件,擴展名為.m)建立 修改 保存 運行
二、Matlab 與線性代數(shù)的基本運算
1.矩陣的輸入
數(shù)字矩陣:A=[1 2 3;3 2 1]
或 A=[1, 2, 3;3, 2, 1] 或 A=[1 2 3 2 1]
符號矩陣(顯示出來元素之間有逗號): 定義符號變量 sym syms
用法:(1).sym(‘[a,b,c;b,c,a]’)或 sym(‘[a b c;b c a]’)
(2).syms a b c
A=[a b c;b c a]
2.產(chǎn)生特殊矩陣的函數(shù):
zeros(m,n)zeros(n)
ones(m,n)ones(n)eye(n)
magic(n)rand(m,n)randn(n)% 產(chǎn)生(0,1)區(qū)間均勻分布的隨機矩陣
3.相關命令:
round(A)% 表示對矩陣A中所有元素進行四舍五入 length(A)% 返回A的長度(列數(shù))size(A)% 返回A的尺寸,行數(shù) 列數(shù) A(i,j)% 引用矩陣A的第i行第j列元素
4.矩陣的基本運算
(1).+-*.*
(2).轉(zhuǎn)置 A’
(3).方陣的冪:A^3
5.求向量組的極大無關組
A?[?1,?2,?3 ]
(1).U=rref(A)% U為A的行最簡形
(2).[U,s]=rref(A)% U為A的行最簡形, s為首非零元所在列組成的向量
(3).rrefmovie(A)% 返回A的行最簡形,且給出每一步化簡過程
6.求線性方程組的解
情形1。Ax=b,其中A為n階可逆陣
法1: x=inv(A)*b 或 x=A^(-1)*b
法2: U=rref([A,b])% 返回值U為矩陣的行最簡形,最后一列即為解x。
情形2。Ax=0, 其中A 為m*n 矩陣,R(A)=r 法1:U=rref(A), 選定自由變量,得到一組基礎解系 法2:z=null(A) % z的列向量為Ax=0的一組標準正交基。 情形3。Ax=b, 其中A 為m*n 矩陣, 求通解 U=rref([A,b])從最后一列找特解,前n列找導出組的基礎解系,然后按格式寫 出Ax=b的通解。(或先寫出以U為增廣矩陣的同解方程組也可。) ?6x1?3x2?2x3?3x4?4x5?5??4x1?2x2?x3?2x4?3x5?4 例子: ?.4x?2x?3x?2x?x?02345?1?2x?x?7x?3x?2x?112345?(4).(5).(6).(7).方陣行列式 det(A)方陣的秩 rank(A)方陣的逆 inv(A)或 A^(-1)矩陣的除法 左除 右除/ AB=C 則 A=C/B B=AC 輸入:A=[6 3 2 3 4;4 2 1 2 3;4 2 3 2 1;2 1 7 3 2]; b=[5 4 0 1]’; U=rref([A,b])?1?0得到:U???0??01/200001000010?3/4?17/20?3/2???2? 6??0???3/2???0??取x2,x5為自由變量,令x2?0,x5?0得Ax=b的特解?*???2? ??6???0??? ??1/2??3/4?????10?????x2??1??0?分別令?????和??得導出組的基礎解系為:?1??0?,?2??1? ?????x5??0??1?0?7/2?????0??1?????3x2?4x5?x1??12?x3?x5或:導出組Ax=0的同解方程組:?,x2,x5為自由變量,分別令?x4??7x52???1/2??3/4?????10????x2?1,x5?0和x2?0,x5?1得導出組的基礎解系為:?1??0?,?2??1?。 ????0?7/2?????0??1?????7.求矩陣的特征值與特征向量 (1).d=eig(A)% d為矩陣A的特征值構(gòu)成的向量 (2).[V,D]=eig(A)% D為A 的特征值構(gòu)成的對角陣,V 的列為A的單位特征向 量,與D中的特征值對應,滿足:A?VDV8.Schmidt 正交化方法 B=orth(A)% B的列向量為A的列空間的一組標準正交基,換句話說,B的列是 A的列向量的正交標準化,滿足B*B?eye(rank(A))。 9.用正交變換化二次型為標準形 先寫出所給二次型的矩陣A,則A為實對稱矩陣,[V,D]=eig(A)% D 為A的特征值構(gòu)成的對角陣,V的列向量為A的正交單位特征 向量,次序與D的元素對應。滿足VAV?D?VT?1'?1,即AV?VD。 AV。 總結(jié) 一個星期前老師給了一個任務,要求用GUI做成一個simulink仿真界面,通過matlab與SQL的連接,然后把仿真結(jié)果存到sql里建的數(shù)據(jù)庫里。從一開始什么都不懂,到現(xiàn)在可以用GUI做一個簡單的界面,以及matlab與sql的連接,這一個星期感慨頗多,尤其是查閱相關資料的痛苦,及找到可以借鑒資料的喜悅,到最后逐漸有了一個清晰的思想。過程如下: 一首先了解GUI 1.1 GUI簡介[1,2] 圖形用戶界面(graphical user interface,GUI)是由窗口、光標、按鍵、菜單、文字說明等對象(Ob-ject)構(gòu)成的一個用戶界面。用戶通過一定的方法(如鼠標或鍵盤)選擇、激活這些圖形對象,使計算機產(chǎn)生某種動作或變化,比如實現(xiàn)計算、繪圖等假如科技工作者僅僅執(zhí)行數(shù)據(jù)分析、解方程等工作,一般不會考慮GUI的制作。但是如果想向客戶提供應用程序,想進行某種技術、方法的演示,想制作一個供反復使用且操作簡單的專用工具,那么圖形用戶界面是最好的選擇之一。開發(fā)實際的應用程序時應該盡量保持程序的界面友好,因為程序界面是應用程序和用戶進行交互的環(huán)境。在當前情況下,使用圖形用戶界面是最常用的方法。提供圖形用戶界面可使用戶更方便地使用應用程序,不需要了解應用程序怎樣執(zhí)行各種命令,只需要了解圖形界面組件的使用方法;同時,不需要了解各種命令是如何執(zhí)行的,只要通過用戶界面進行交互操作就可以正確執(zhí)行程序。 在Matlab7.0中,圖形用戶界面是一種包含多種圖形對象的界面,典型的圖形界面包括圖形顯示區(qū)域、功能按鈕空間以及用戶自定義的功能菜單等。為了讓界面實現(xiàn)各種功能,需要對各個圖形對象進行布局和時間編程。這樣,當用戶激活對應的GUI對象時,就能執(zhí)行相應的時間行為。最后,必須保存和發(fā)布自己創(chuàng)建的GUI,使得用戶可以應用GUI對象。在Matlab中,所有對象都可以使用M文件進行編寫。GUI也是一種Matlab對象,因此,可以使用M文件來創(chuàng)建GUI。使用M文件創(chuàng)建GUI的方法也是最基礎的,使用其他方法創(chuàng)建GUI圖形界面時,實現(xiàn)圖形控件的各種功能時,也需要編寫相應的程序代碼。 除了使用M文件來創(chuàng)建GUI對象之外,Matlab還為用戶開發(fā)圖形界面提供了一個方便高效的集成開發(fā)環(huán)境:Matlab圖形用戶界面開發(fā)環(huán)境(matlab graphical user interface development envi-ronment)簡稱GUIDE,其主要是一個界面設計工具集。Matlab7.0將所有GUI所支持的用戶控件都集成起來,同時提供界面外觀、屬性和行為響應方法的設置方法。除了可以使用GUIDE創(chuàng)建GUI之外,還可以將設計好的GUI界面保存為一個FIG資源文件,自動生成對應的M文件。該M文件包含了GUI初始化代碼和組建界面布局的控制代碼。使用GUIDE創(chuàng)建GUI對象執(zhí)行效率高,可以交互式地進行組件布局,還能生成保存和發(fā)布GUI的對應文件。 FIG文件:該文件包含GUI圖形窗口及其子對象的完全描述,包含所有相關對象的屬性信息,可以調(diào)用hgsave命令或者使用M文件編輯器的File>Save命令生成該文件。FIG文件是一個二進制文件,包含系列化的圖形窗口對象。所有對象的屬性都是用戶創(chuàng)建圖形窗口時保存的屬性。該文件最主要的功能是對象句柄的保存。 M文件:該文件包含GUI設計、控制函數(shù)及控件的回調(diào)函數(shù),主要用來控制GUI展開時的各種特征。該文件基本上可以分為GUI初始化和回調(diào)函數(shù)2個部分,控件的回調(diào)函數(shù)根據(jù)用戶與GUI的具體交互行為分別調(diào)用。應用程序M文件使用open-fig命令來顯示GUI對象,但是該文件不包含用戶界面設計的代碼,對應代碼由FIG文件保存。1.2 設計GUI步驟 簡單說來,一個好的界面應遵循以下3個原則:簡單性(Simplicity)、一致性(Consistency)及習常性(Familiarity)。界面制作包括界面設計和程序?qū)崿F(xiàn)。具體制作步驟如下[3,4]: 1)分析界面所要求實現(xiàn)的主要功能,明確設計任務;2)在稿紙上繪出界面草圖,并站在使用者的角度來審查草圖;3)按構(gòu)思的草圖,上機制作(靜態(tài))界面,并對其進行檢查;4)編寫界面動態(tài)功能的程序,對功能進行逐項檢查。 以上過程只是一般原則,在設計中,步驟之間也可能要交叉執(zhí)行或復合執(zhí)行;設計和實現(xiàn)過程往往不是一步到位的,可能需要反復修改,才能獲得滿意的界面。建議先進行界面布局編碼,后進行動態(tài)交互功能的編碼。 二數(shù)據(jù)庫與matlab的連接 2.1 ODBC簡介[5] ODBC(開放式數(shù)據(jù)庫的連接)是一種應用程序的接口(API)。這種接口提供了獨立于任何的數(shù)據(jù)庫管理系統(tǒng)編寫應用程序的能力。ODBC通過ODBC驅(qū)動程序提供了對不同的數(shù)據(jù)庫供應商的一組應用程序接口來給特殊的數(shù)據(jù)庫管理系統(tǒng)(DBMS)。用戶的應用程序使用這組API來調(diào)度ODBC驅(qū)動程序,然后驅(qū)動程序通過SQL語句同DBMS發(fā)生聯(lián)系。DBC提供了數(shù)據(jù)庫管理系統(tǒng)的標準接口,從而使應用人員在編程時不必關心底層的DBMS,大大提高了工作效率。2.2 32位matlab與32 位sql位數(shù)據(jù)庫之間的連接 2.2.1數(shù)據(jù)庫的建立 在SQL Server2008中建立數(shù)據(jù)庫test,在其中建立表stock。2.2.2 SQL數(shù)據(jù)源的配置 建立ODBC數(shù)據(jù)源:控制面板->管理工具->ODBC數(shù)據(jù)源->用戶DNS。點擊“添加”,數(shù)據(jù)源名稱可任意命名。服務器選擇自己指定的。2.2.3.MATLAB連接數(shù)據(jù)庫M文件的編寫 1 連接數(shù)據(jù)庫 代碼如下 >> conn=database('test','sa','123')%test是剛剛建立的數(shù)據(jù)庫名稱 %sa是數(shù)據(jù)庫登陸名%‘123’是數(shù)據(jù)庫登陸密碼 2 檢驗數(shù)據(jù)庫連接狀態(tài) >> Ping(conn);%用于查看現(xiàn)在數(shù)據(jù)庫連接狀態(tài) 3 數(shù)據(jù)寫入 >>expdata=[2001 7 12 000001 0.123432];>>fastinsert(conn,{'year','month','day','id','stock_return'},expdata);備注: (1)Conn一個變量,是用于保存數(shù)據(jù)庫連接字符竄的,conn=database('test','sa','123');只要數(shù)據(jù)庫已經(jīng)連接上,后面就可以直接引用。 (2)'year','month','day','id','stock_return'是數(shù)據(jù)庫表格中的字段名(3)expdata=[2001 7 12 000001 0.123432]是我們要寫入數(shù)據(jù)庫的信息,分別對應于數(shù)據(jù)表中的各個字段。這里我們寫入數(shù)據(jù)庫的是number型的,因此矩陣式數(shù)字型。即:expdata=[2001 7 12 000001 0.123432]。(4)寫入數(shù)據(jù)前提是已經(jīng)成功連接數(shù)據(jù)庫。4 數(shù)據(jù)的查詢 代碼: >>curs=(conn,'select * from test.dbo.stock')%建立數(shù)據(jù)庫的連接 >>curs=exec(conn,'select * from test.dbo.stock where id=1')%從test數(shù)據(jù)庫,stock表格里面選擇 股票代碼為1的股票的所有信息 >>curs=fetch(curs)%取回數(shù)據(jù)庫游標里面的數(shù)據(jù); >>curs.data%讀取游標里面的數(shù)據(jù) 5 顯示查詢后的信息: >>curs.data 6關閉鏈接對象和游標——close 當不再使用數(shù)據(jù)庫的鏈接對象時要及時關閉,這樣才能及時的釋放出內(nèi)存,而且每次鏈接后所需要的內(nèi)存量是非常大的,要是不及時關閉的話對后續(xù)計算的影響將非常非常的大。close(curs)close(conna) 2.3 64位matlab與64位sql數(shù)據(jù)庫之間的連接(以下為網(wǎng)絡整理未證實) 64位Matlab無法通過ODBC接口訪問SQL Server,我們可以跳出ODBC,而直接使用JDBC來訪問數(shù)據(jù)庫 第一步,從Microsoft.COM 下載Microsoft SQL Server JDBC Driver 3.0,下載地址可以將上述關鍵字扔進Google中搜索就得到了。解壓縮可以得到很多文件,我們需要的是其中的sqljdbc4.jar和sqljdbc.jar這兩個文件。其中后者是前者的子集,只要不出問題,直接使用前者就可以了。 第二步,在Matlab中加入jar。具體做法是找到“classpath.txt”文件,例如我的這個文件位置是 “D:Matlab2010Btoolboxlocalclasspath.txt”,在文件的最后加入sqljdbc4.jar的完整路徑,例如我的是:“D:/sqljdbc30/enu/sqljdbc4.jar”,注意斜杠怎么寫。 第三步,啟動Matlab,啟動過程中如果沒有出錯,那么這個JDBC Connector就可以用了。 上面三步就把JDBC Connector建好了。接下來我們就開始連接數(shù)據(jù)庫。第一步,建立一個到數(shù)據(jù)庫的連接。假設SQL Server地址是 192.30.1.117,端口是 1433,數(shù)據(jù)庫名稱是RTQ,用戶名user,密碼 pwd,那么用下面的語句建立一個到該數(shù)據(jù)庫的連接。 conn=database('RTQ','user','pwd','com.microsoft.sqlserver.jdbc.SQLServerDriver',...'jdbc:sqlserver://192.30.1.117:1433;databaseName=RTQ'); 參考文獻 [1]MATLAB Application Program Interface Guide[C],TheMathworks Inc,1999 [2]王躍強、王紀龍、王云才,VB程序中實現(xiàn)調(diào)用MATLAB的方法[J],計算機應用,2001,vol.21,No.2 [3]劉炳文編著,精通Visual Basic 6.0中文版[M]北京:電子工業(yè)出版社,1999.7 [4]劉衛(wèi)國,科學計算與MATLAB語言[M],中國鐵道出版社,2000.4 [5]侯春生,陳汝義,袁愛進,喬 毅,唐明新.MATLAB/VB/SQL Server編程實現(xiàn)數(shù)據(jù)管理[J].微型電腦應用,Vol.18,No.7,2002第五篇:matlab與sql總結(jié)