版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、Matlab與C/C+混合編程接口及應(yīng)用 摘要:Matlab具有很強的數(shù)值計算和分析等能力,而C/C+是目前最為流行的高級程序設(shè)計語言,兩者互補結(jié)合的混合編程在科學(xué)研究和工程實踐中具有非常重要的意義。從Matlab調(diào)用C/C+代碼及C/C+調(diào)用m文件兩方面,深入地研究了它們之間混合編程的原理和實現(xiàn)機制,并且給出了具體條件下的混合編程方法和步驟。實驗表明,給出的Matlab與C/C+混合編程接口及應(yīng)用方法是有效、實用的。1引言Matlab是當(dāng)前應(yīng)用最為廣泛的數(shù)學(xué)軟件,具有強大的數(shù)值計算、數(shù)據(jù)分析處理、系統(tǒng)分析、圖形顯示甚至符號運算等功能1。利用這一完整的數(shù)學(xué)平臺,用戶可以快速實現(xiàn)十分復(fù)雜的功能,
2、極大地提高工程分析計算的效率23。但與其他高級程序3相比,Matlab程序是一種解釋執(zhí)行程序,不用編譯等預(yù)處理,程序運行速度較慢4。C/C+語言是目前最為流行的高級程序設(shè)計語言之一5。它可對操作系統(tǒng)和應(yīng)用程序以及硬件進行直接操作,用C/C+語言明顯優(yōu)于其它解釋型高級語言,一些大型應(yīng)用軟件如 Matlab 就是用C語言開發(fā)的。在工程實踐中,用戶經(jīng)常遇到Matlab與C/C+混合編程的問題。本文基于Matlab 6.5和VC6.0開發(fā)環(huán)境,在Windows平臺下就它們之間的混合編程問題進行深入研究并舉例說明。2 Matlab調(diào)用C/C+Matlab調(diào)用C/C+的方式主要有兩種:利用MEX技術(shù)和調(diào)用
3、C/C+動態(tài)連接庫。在Matlab與C/C+混合編程之前,必須先對Matlab的編譯應(yīng)用程序mex和編譯器mbuild進行正確的設(shè)置1:對Matlab編譯應(yīng)用程序mex的設(shè)置:Mex setup.對Matlab編譯器mbuild的設(shè)置:Mbuild setup.2.1調(diào)用C/C+的MEX文件MEX是Matlab Executable的縮寫,它是一種“可在Matlab中調(diào)用的C(或Fortran)語言衍生程序”6。MEX文件的使用極為方便,其調(diào)用方式與Matlab的內(nèi)建函數(shù)完全相同,只需在Matlab命令提示符下鍵入MEX文件名即可。一個C/C+的MEX源程序通常包括4個組成部分,其中前3個是必
4、須包含的內(nèi)容,第4個則根據(jù)所實現(xiàn)的功能靈活選用:(1)#include “mex.h”;(2)MEX文件的入口函數(shù)mexFunction, MEX文件導(dǎo)出名必須為mexFunction函數(shù);(3)mxArray;(4)API函數(shù)通過簡單的例子說明C/C+的MEX源程序編寫和調(diào)用過程:#include mex.hvoid timeSTwo(double y, double x) y0 = 2.0*x0; void mexFunction(int nlhs, mxArray * plhs, int nrhs, const mxArray *prhs) double *x,*y; int mrows
5、, ncols;if( nrhs!=1) mexErrMsgTxt(One input required.);else if( nlhs1) mexErrMsgTxt(Too manyoutput arguments); mrows = mxGetM( prhs0 ); ncols = mxGetN(prhs0);if( !mxIsDouble(prhs0) | mxIsComplex( prhs0 ) | !( mrows =1 & ncols=1 ) ) mexErrMsgTxt( Input must be a noncomplex scalar double. );plhs0 = mx
6、CreateDoubleMatrix ( mrows, ncols, mxREAL );x = mxGetPr( prhs0 ); y = mxGetPr( plhs0 ); timestwo(y,x); 可在matlab中編譯,也可以直接在C+環(huán)境中編譯:1).(在matlab中)用指令mex timestwo.c編譯此文件,然后在MATLAB命令行下調(diào)用生成的MEX文件即可。2). (在VC2008中)和一般c+一樣編譯后,就會產(chǎn)生dll,這樣可以直接在Matlab中用了,或者copy且更改后綴名.mexw32即可。(因為Matlab R2010b以后版本可能不支持調(diào)用dll為后綴的mex
7、文件了)2.2調(diào)用C/C+動態(tài)連接庫(即:一般普通的C程序dll沒有用mex的接口函數(shù))Matlab提供對動態(tài)連接庫DLL文件的接口7。利用該接口,可在Matlab中調(diào)用動態(tài)連接庫導(dǎo)出的函數(shù)。Matlab對DLL的接口支持各種語言編寫的DLL文件。在調(diào)用DLL文件之前,需要準(zhǔn)備函數(shù)定義的頭文件。對于C/C+語言開發(fā)的DLL文件,可使用源程序中相應(yīng)的頭文件;而對于其他語言開發(fā)的DLL,則要手工準(zhǔn)備等效的C語言函數(shù)定義頭文件。在Matlab中利用動態(tài)連接庫接口技術(shù)通常需要完成以下4個步驟:(1)打開動態(tài)連接庫文件;(2)為調(diào)用函數(shù)準(zhǔn)備數(shù)據(jù);(3)調(diào)用動態(tài)連接庫文件中導(dǎo)出的函數(shù);(4)關(guān)閉動態(tài)連接庫
8、文件。為了實現(xiàn)以上步驟,用到的Matlab函數(shù)有:loadlibrary, loadlibrary, calllib, libfunctions, lipointer, libstruct, libisloaded。下面舉例說明Matlab調(diào)用C/C+動態(tài)連接庫的方法和步驟:a.在VC環(huán)境下,新建工程-win32動態(tài)連接庫-工程名Test1-empty工程-完成;b.新建-C+源文件-添加a.cpp,內(nèi)容為:#include a.h_declspec(dllexport) int add(int a, int b) return a+b; c.新建-C/C+頭文件-添加a.h,內(nèi)容為: _de
9、clspec(dllexport) int add(int a,intb); 然后編譯生成Test1.dll動態(tài)連接庫文件,將Test1.dll和a.h拷到Matlab 工作目錄下。d.在Matlab命令行下,調(diào)用Test.dll:loadlibrary(Test1,a.h); x=7;y=8; calllib(Test1,add,x,y); Ans=15 unloadlibrary(Test1).調(diào)用DLL動態(tài)連接庫的方法,為Matlab重用工程實踐中積累的大量實用C/C+代碼提供了一種簡潔方便的方法。與調(diào)用MEX文件相比,該方法更加簡便實用。但是這個接口之支持C,不支持C+庫和函數(shù)的重載,
10、這種情況下,推薦用MEX-file,若實在要用這種方法(調(diào)用C/C+動態(tài)連接庫),則對于C+要做一些更改,詳見http:/www.mathworks.de/help/techdoc/matlab_external/f43202.html#bq_4nu-1,3 C/C+調(diào)用Matlab在工程實踐中,C/C+調(diào)用Matlab的方法主要有調(diào)用Matlab計算引擎、包含m文件轉(zhuǎn)換的C/C+文件,以及調(diào)用m文件生成的DLL文件。3.1利用Matlab計算引擎Matlab的引擎庫為用戶提供了一些接口函數(shù),利用這些接口函數(shù),用戶在自己的程序中以計算引擎方式調(diào)用Matlab文件。該方法采用客戶機/服務(wù)器的方式
11、,利用Matlab引擎將Matlab和C/C+聯(lián)系起來。在實際應(yīng)用中,C/C+程序為客戶機,Matlab作為本地服務(wù)器。C/C+程序向Matlab計算引擎?zhèn)鬟f命令和數(shù)據(jù)信息,并從Matlab計算引擎接收數(shù)據(jù)信息2。Matlab提供了以下幾個C語言計算引擎訪問函數(shù)供用戶使用8:engOpen,engClose, engGetVariable,engPutVariable,engEvalString,engOutputBuffer,engOpenSingleUse, engGetVisible,engSetVisible。下面以C語言編寫的、調(diào)用Matlab引擎計算方程x3 ?2x+5=0根的源程
12、序example2.c為例,說明C/C+調(diào)用Matlab計算引擎編程的原理和步驟:#include #include #include #include engine.hint PASCAL WinMain (HANDLE hInstance, HANDLE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow ) Engine *ep; mxArray *P=NULL,*r=NULL; char buffer301; double poly4 = 1,0,-2,5 ; if ( !(ep =engOpen(NULL) ) ) fprintf( stde
13、rr,nCant start MATLAB enginen ); return EXIT_FAILURE; P = mxCreateDoubleMatrix( 1, 4, mxREAL); mxSetClassName( P, p ); memcpy( ( char * ) mxGetPr( P ), (char *) poly, 4*sizeof(double) ); engPutVariable( ep, P ); engOutputBuffer( ep, buffer, 300 ); engEvalString( ep, disp(多項式,poly2str(p,x),的根),r=root
14、s(p) ); MESSageBox(NULL,buffer,example2展示MATLAB引擎的應(yīng)用,MB_OK); engClose( ep ); mxDestroyArray( P ); return EXIT_SUCCESS;在Matlab下運行example2.exe: mex -f example2.c。運行結(jié)果如圖1所示: 利用計算引擎調(diào)用Matlab的特點是:節(jié)省大量的系統(tǒng)資源,應(yīng)用程序整體性能較好,但不能脫離Matlab的環(huán)境運行,且運行速度較慢,但在一些特別的應(yīng)用9(例如需要進行三維圖形顯示)時可考慮使用。3.2利用mcc編譯器生成的cpp 和hpp文件Matlab自帶的
15、C+Complier-mcc,能將m文件轉(zhuǎn)換為C/C+代碼。因此,它為C/C+程序調(diào)用m文件提供了另一種便捷的方法。下面舉例說明相應(yīng)步驟:a.新建example3.m: function y=exmaple3(n) y=0; for i=1:n y=y+i; end保存后在命令窗口中輸入:mcc -t -L Cpp -h example3.則在工作目錄下生成example3.cpp和example3.hpp兩個文件。b.在VC中新建一個基于對話框的MFC應(yīng)用程序Test2,添加一個按鈕,并添加按鈕響應(yīng)函數(shù),函數(shù)內(nèi)容見f步。將上面生成的兩個文件拷貝到VC工程的Test2目錄下。c.在VC中選擇:
16、工程-設(shè)置,選擇屬性表Link選項,下拉菜單中選擇Input,在對象 / 庫模塊中加入lIBMmfile.lib libmatlb.lib libmx.lib libmat.lib libmatpm.lib sgl.lib libmwsglm.lib libmwservices.lib,(后三個為使用Matlab圖形庫時,需加入)注意用空格分開;而在忽略庫中加入 msvcrt.lib;d.選擇屬性表C/C+選項,下拉菜單選General,在預(yù)處理程序定義中保留原來有的內(nèi)容,并添加MSVC,IBMPC,MSWIND,并用逗號隔開。選擇下拉菜單的Precompiled Headers 選項,在“自
17、動使用預(yù)補償頁眉”中添加stdafx.h,然后確定。e.選擇:工具- 選項,屬性頁選擇“目錄”,在include files加入: C:MATLAB6p5p1externinclude, C:MATLAB6p5p1externincludecpp;然后在 Library files里面加入: C:MATLAB6p5p1binwin32, C:MATLAB6p5p1extern libwin32microsoftmsvc60;注意根據(jù)用戶的Matlab安裝位置,修改相應(yīng)目錄。f.在響應(yīng)函數(shù)中添加頭文件:#include matlab.hpp #include example3.hpp函數(shù)響應(yīng)代碼
18、為:int i; mwArray n; n=10; n=example3(n); i=n.ExtractScalar(1);CString str; str.Format( example3的返回值是:%d, I ); AfxMessageBox( str );g.編譯,連接,執(zhí)行,結(jié)果如圖2所示。 3.3利用mcc編譯器生成的DLL 文件Matlab的C+ Complier不僅能夠?qū)atlab的m文件轉(zhuǎn)換為C/C+的源代碼,還能產(chǎn)生完全脫離Matlab運行環(huán)境的獨立可執(zhí)行DLL程序。從而可以在C/C+程序中,通過調(diào)用DLL實現(xiàn)對 Matlab代碼的調(diào)用。下面通過一個簡單的例子說明C/C+調(diào)
19、用m文件生成的DLL:a.建立m文件example4.m: function result = example4(para)x=1 para 3; y=1 3 1; plot( x,y ); result=para*2; end.然后在命令窗口中輸入:mcc -t -W libhg: example4 -T link: lib -h libmmfile.mlib libmwsglm.mlib example4則在工作目錄下會生成example4 .dll、example4 .lib和example4 .h三個文件。b.在VC中新建一個基于對話框的應(yīng)用程序Test3,然后添加一個按鈕及按鈕響應(yīng)函
20、數(shù),函數(shù)內(nèi)容見d步,再將生成的3個文件拷貝到Test2工程目錄下。c.VC編譯環(huán)境的設(shè)置如同3.2節(jié)c、d步;d.在按鈕函數(shù)文件添加如下的頭文件:#include example4 .h,函數(shù)響應(yīng)代碼為:mxArray*para=mxCreateDoubleScalar(2); mxArray* result; example4Initialize();result =mlfExample4(para); CString str;str.Format( %f,mxGetScalar(result) ); AfxMessageBox(str);e.編譯,連接,執(zhí)行,結(jié)果如圖3所示。 利用mcc編
21、譯器生成的DLL動態(tài)連接庫文件,只需在C/C+編譯環(huán)境中將其包含進來,調(diào)用導(dǎo)出函數(shù)即可實現(xiàn)原m文件的功能,極大地方便了用戶的代碼設(shè)計。4結(jié)束語本文從Matlab調(diào)用C/C+代碼和C/C+調(diào)用m文件兩方面,詳細(xì)地研究了Matlab與C/C+混合編程技術(shù)。對于Matlab調(diào)用C/C+代碼,給出了常用的MEX技術(shù)和調(diào)用C/C+動態(tài)連接庫的方法,并對它們進行比較。針對用戶在實際中經(jīng)常遇到的C/C+調(diào)用Matlab問題,通過研究給出了常用的三種方法及其特點:利用Matlab計算引擎的方法,混合編程后的可執(zhí)行程序脫離不了Matlab的運行環(huán)境,運行速度很慢;利用mcc編譯器將m文件轉(zhuǎn)化為C/C+文件的方法
22、,雖然能獨立于Matlab運行環(huán)境,可在C/C+環(huán)境中包含生成的文件非常繁瑣;但是m文件生成的DLL為用戶提供了一種簡潔方便的C/C+調(diào)用Matlab代碼的方法。除 Matlab自帶的mcc外,Matcom 也能將M文件編譯為C/C+文件和DLL文件28,但混合編程原理一樣,在此省略。 MATLAB與C/C+混合編程之MATLAB調(diào)用C程序2007-11-25 15:28 12073人閱讀評論(13)收藏舉報通過把耗時長的函數(shù)用c語言實現(xiàn),并編譯成mex函數(shù)可以加快執(zhí)行速度。Matlab本身是不帶c語言的編譯器的,所以要求你的機器上已經(jīng)安裝有VC,BC或Watcom C中的一種。如果你在安裝M
23、atlab時已經(jīng)設(shè)置過編譯器,那么現(xiàn)在你應(yīng)該就可以使用mex命令來編譯c語言的程序了。如果當(dāng)時沒有選,就在Matlab里鍵入mex -setup,下面只要根據(jù)提示一步步設(shè)置就可以了。需要注意的是,較低版本的在設(shè)置編譯器路徑時,只能使用路徑名稱的8字符形式。比如我用的VC裝在路徑C:/PROGRAM FILES/DEVSTUDIO下,那在設(shè)置路徑時就要寫成:“C:/PROGRA1”這樣設(shè)置完之后,mex就可以執(zhí)行了。為了測試你的路徑設(shè)置正確與否,把下面的程序存為hello.c。/*hello.c*/#include mex.h void mexFunction(int nlhs, mxArray
24、 *plhs, int nrhs, const mxArray *prhs) mexPrintf(hello,world!/n); 假設(shè)你把hello.c放在了C:/TEST/下,在Matlab里用CD C:/TEST/ 將當(dāng)前目錄改為C:/ TEST/(注意,僅將C:/TEST/加入搜索路徑是沒有用的)?,F(xiàn)在敲:mex hello.c 如果一切順利,編譯應(yīng)該在出現(xiàn)編譯器提示信息后正常退出。如果你已將C:/TEST/加入了搜索路徑,現(xiàn)在鍵入hello,程序會在屏幕上打出一行:hello,world! 看看C/TEST/目錄下,你會發(fā)現(xiàn)多了一個文件:HELLO.DLL。這樣,第一個mex函數(shù)就算
25、完成了。分析hello.c,可以看到程序的結(jié)構(gòu)是十分簡單的,整個程序由一個接口子過程 mexFunction構(gòu)成。void mexFunction(int nlhs, mxArray *plhs, int nrhs, const mxArray *prhs) 前面提到過,Matlab的mex函數(shù)有一定的接口規(guī)范,就是指這nlhs:輸出參數(shù)數(shù)目 plhs:指向輸出參數(shù)的指針 nrhs:輸入?yún)?shù)數(shù)目 例如,使用a,b=test(c,d,e)調(diào)用mex函數(shù)test時,傳給test的這四個參數(shù)分別是 2,plhs,3,prhs其中: prhs0=c prhs1=d prhs2=e 當(dāng)函數(shù)返回時,將會把
26、你放在plhs0,plhs1里的地址賦給a和b,達到返回數(shù)據(jù)的目的。 細(xì)心的你也許已經(jīng)注意到,prhsi和plhsi都是指向類型mxArray類型數(shù)據(jù)的指針。 這個類型是在mex.h中定義的,事實上,在Matlab里大多數(shù)數(shù)據(jù)都是以這種類型存在。當(dāng)然還有其他的數(shù)據(jù)類型,可以參考Apiguide.pdf里的介紹。 為了讓大家能更直觀地了解參數(shù)傳遞的過程,我們把hello.c改寫一下,使它能根據(jù)輸 入?yún)?shù)的變化給出不同的屏幕輸出:/hello.c 2.0 #include mex.h void mexFunction(int nlhs, mxArray *plhs, int nrhs, const
27、 mxArray *prhs) int i; i=mxGetScalar(prhs0); if(i=1) mexPrintf(hello,world!/n); else mexPrintf(大家好!/n); 將這個程序編譯通過后,執(zhí)行hello(1),屏幕上會打出: hello,world! 而hello(0)將會得到: 大家好! 現(xiàn)在,程序hello已經(jīng)可以根據(jù)輸入?yún)?shù)來給出相應(yīng)的屏幕輸出。在這個程序里,除了用到了屏幕輸出函數(shù)mexPrintf(用法跟c里的printf函數(shù)幾乎完全一樣)外,還用到了一個函數(shù):mxGetScalar,調(diào)用方式如下: i=mxGetScalar(prhs0);
28、Scalar就是標(biāo)量的意思。在Matlab里數(shù)據(jù)都是以數(shù)組的形式存在的,mxGetScalar的作用就是把通過prhs0傳遞進來的mxArray類型的指針指向的數(shù)據(jù)(標(biāo)量)賦給C程序里的變量。這個變量本來應(yīng)該是double類型的,通過強制類型轉(zhuǎn)換賦給了整形變量i。既然有標(biāo)量,顯然還應(yīng)該有矢量,否則矩陣就沒法傳了??聪旅娴某绦颍?/hello.c 2.1 #include mex.h void mexFunction(int nlhs, mxArray *plhs, int nrhs, const mxArray *prhs) int *i; i=mxGetPr(prhs0); if(i0=1)
29、 mexPrintf(hello,world!/n); else mexPrintf(大家好!/n); 這樣,就通過mxGetPr函數(shù)從指向mxArray類型數(shù)據(jù)的prhs0獲得了指向double類型的指針。但是,還有個問題,如果輸入的不是單個的數(shù)據(jù),而是向量或矩陣,那該怎么處理呢 ?通過mxGetPr只能得到指向這個矩陣的指針,如果我們不知道這個矩陣的確切大小,就 沒法對它進行計算。 為了解決這個問題,Matlab提供了兩個函數(shù)mxGetM和mxGetN來獲得傳進來參數(shù)的行數(shù) 和列數(shù)。下面例程的功能很簡單,就是獲得輸入的矩陣,把它在屏幕上顯示出來: /show.c 1.0 #include
30、mex.h void mexFunction(int nlhs, mxArray *plhs, int nrhs, const mxArray *prhs) double *data; int M,N; int i,j; data=mxGetPr(prhs0); /獲得指向矩陣的指針 M=mxGetM(prhs0); /獲得矩陣的行數(shù) N=mxGetN(prhs0); /獲得矩陣的列數(shù) for(i=0;iM;i+) for(j=0;jN;j+) mexPrintf(%4.3f ,dataj*M+i); mexPrintf(/n); 編譯完成后,用下面的命令測試一下: a=1:10; b=a;a
31、+1; show(a) show(b) 需要注意的是,在Matlab里,矩陣第一行是從1開始的,而在C語言中,第一行的序數(shù)為零,Matlab里的矩陣元素b(i,j)在傳遞到C中的一維數(shù)組大data后對應(yīng)于dataj*M+i 。 輸入數(shù)據(jù)是在函數(shù)調(diào)用之前已經(jīng)在Matlab里申請了內(nèi)存的,由于mex函數(shù)與Matlab共用同一個地址空間,因而在prhs里傳遞指針就可以達到參數(shù)傳遞的目的。但是,輸出參數(shù)卻需要在mex函數(shù)內(nèi)申請到內(nèi)存空間,才能將指針放在plhs中傳遞出去。由于返回指針類型必須是mxArray,所以Matlab專門提供了一個函數(shù):mxCreateDoubleMatrix來實現(xiàn)內(nèi)存的申請,
32、函數(shù)原型如下: mxArray *mxCreateDoubleMatrix(int m, int n, mxComplexity ComplexFlag) m:待申請矩陣的行數(shù) n:待申請矩陣的列數(shù) 為矩陣申請內(nèi)存后,得到的是mxArray類型的指針,就可以放在plhs里傳遞回去了。但是對這個新矩陣的處理,卻要在函數(shù)內(nèi)完成,這時就需要用到前面介紹的mxGetPr。使用 mxGetPr獲得指向這個矩陣中數(shù)據(jù)區(qū)的指針(double類型)后,就可以對這個矩陣進行各種操作和運算了。下面的程序是在上面的show.c的基礎(chǔ)上稍作改變得到的,功能是將輸 /reverse.c 1.0 #include mex.h void mexFunction(int nlhs, mxArray *plhs, int nrhs, const mxArray *prhs) double *inData; double *outData; int M,N; int i,j; inData=mxGetPr(prhs0); M=mxGetM(prhs0); N=mxGetN(prhs0); plhs0=mxCreateDoubleMatrix(M,N,mxREAL); outData=mxGetPr(plhs0); for(i=0;iM;i+)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2023-2029年中國同程貨運行業(yè)市場發(fā)展監(jiān)測及投資戰(zhàn)略規(guī)劃研究報告
- 2024-2030年中國休閑女裝行業(yè)發(fā)展?jié)摿︻A(yù)測及投資戰(zhàn)略研究報告
- 中國聚氨酯發(fā)泡塑件項目投資可行性研究報告
- 2025年全自動咖啡機項目可行性研究報告
- 2025裝飾裝修施工合同樣本
- 2025年第三方醫(yī)學(xué)實驗室項目評估報告
- 2025招商銀行網(wǎng)上“企業(yè)銀行”自助貸款授信合同范本
- 2025構(gòu)件的加工合同范文
- 《3-6歲兒童發(fā)展指南》解讀 讀后感
- bpmf教學(xué)評價模板
- 學(xué)術(shù)不端行為治理研究
- 企業(yè)文化、戰(zhàn)略與電力能源知識參考題庫練習(xí)卷含答案(一)
- 福建南平武夷高新技術(shù)產(chǎn)業(yè)控股集團有限公司招聘筆試沖刺題2024
- 2024年設(shè)備維修部管理制度(6篇)
- GB/T 45083-2024再生資源分揀中心建設(shè)和管理規(guī)范
- 精神科護理工作計劃例文
- 2024山地買賣合同模板
- 河北省承德市2023-2024學(xué)年高一上學(xué)期期末物理試卷(含答案)
- 【初中化學(xué)】二氧化碳的實驗室制取教學(xué)課件-2024-2025學(xué)年九年級化學(xué)人教版上冊
- 出租車行業(yè)服務(wù)質(zhì)量提升方案
- 景區(qū)安全管理教育培訓(xùn)
評論
0/150
提交評論