MATLAB 应用程序接口API

MATLAB 应用程序接口API
MATLAB 应用程序接口API

MATLAB中的应用程序接口API

前面章节主要叙述MATLAB自身的各种功能和使用方法。作为优秀软件,MATLAB不仅自身功能强大、环境友善、能十分有效地处理各种科学和工程问题,而且具有极好的开放性。这开放性表现在两方面:一,MATLAB适应各科学、专业研究的需要,提供了各种专业性的工具包;二,MATLAB为实现与外部应用程序的“无缝”结合,提供了专门的应用程序接口API。遵循本书“淡化专业,面向通用”的宗旨,本章将集中阐述MATLAB的应用程序接口。本章分五节,各节内容简述如下。

第12.1节集中介绍:如何编写C MEX源码程序,也就是如何为现有的C程序编写接口程序,使之成为MATLAB函数文件;运用这种技术,读者可以把积累的优秀C程序改造成可在MATLAB中方便调用的指令。

第12.2节用于演示:如何编写产生MAT数据文件的C源码程序。读者通过算例入门,就不难借助MAT文件实现MATLAB与外部应用程序的数据交换。

第12.3节围绕MATLAB引擎技术展开。借助这种技术,前台可以是各种外部应用程序编写的界面,而后台计算则可完全交由MATLAB进行。

第12.4节用三个算例来说明如何应用ActiveX实现MATLAB与外部应用程序的通信。在第一个算例中,MATLAB用作为客户,服务器是Excel。在后两个算例中,服务器是MATLAB,而客户是PowerPoint。由此产生的PPT文件,可以在放映过程中,实时地进行MATLAB调用。

第12.5节的内容是:如何借助DDE技术在MATLAB与其他外部程序间进行通信。该节的一个算例演示:VB制作的界面如何借助DDE建立的对话通道调用服务器MATLAB进行计算和显示结果图形。而另一个算例则演示:MATLAB如何以客户身份与服务器Excel建立DDE“热连接”,使MATLAB图形实时地跟随电子表格数据的改变而变化。

值得指出:MATLAB6.0, 6.1版用于API的(MEX、MAT、及引擎)库函数许多已经被废止。本章内容是根据MATLAB6.5编写的。

12.1C语言MEX文件的编写

12.1.1关于MEX文件的一般性说明

12.1.2MEX文件中的MATLAB数据

A=['abcd';'1234';'ABCD']

A =

abcd

1234

ABCD

12.1.3C语言MEX文件源程序的构成

【例12.1.3-1】列出具有相同运算功能(实现两个双精度实数标量加法)的C++源码程序和C++ MEX源码程序;对C++ MEX源码程序进行编译链接;在MATLAB 中调用生成的DLL文件。通过本例,从感性上认识:(A)一般C源码文件如何改写成具有约定格式的C MEX源码文件;(B)C MEX 源码文件的基本结构;(C)基本的编译链接方法;(D)DLL文件的调用方法。

(1)

#include

void myplus(double y[],double x[],double z[])

{

y[0]=x[0]+z[0];

return;

}

(2)

[exm12013_1.cpp]

#include "mex.h" // <1>

//-------------------------------------------------

void myplus(double y[],double x[],double z[])

{

y[0]=x[0]+z[0];

}

//-------------------------------------------------

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])

//<8>

{

double *x,*y,*z; //

int mrows0,ncols0; //

int mrows1,ncols1; //

if (nrhs!=2)

//<13>

mexErrMsgTxt("Two inputs required.");

//<16>

else if (nlhs>1)

//<15>

mexErrMsgTxt("Too many output arguments");

//<16>

mrows0=mxGetM(prhs[0]);

//<17>

ncols0=mxGetN(prhs[0]);

mrows1=mxGetM(prhs[1]);

ncols1=mxGetN(prhs[1]);

//<20>

//

if (!mxIsDouble(prhs[0])||mxIsComplex(prhs[0])||!(mrows0==1 && ncols0==1)) //<22>

mexErrMsgTxt("Inputs must be all noncomplex scalar double.");

//

if (!mxIsDouble(prhs[1])||mxIsComplex(prhs[1])||!(mrows1==1 && ncols1==1)) //<25>

mexErrMsgTxt("Inputs must be all noncomplex scalar double.");

//

if (mrows0!=mrows1||ncols0!=ncols1)

//<28>

mexErrMsgTxt("Inputs must be same dimension.");

//<29>

//

plhs[0]=mxCreateDoubleMatrix(mrows0,ncols0,mxREAL);

//<31>

x=mxGetPr(prhs[0]);

//<32>

z=mxGetPr(prhs[1]);

//<33>

y=mxGetPr(plhs[0]);

//<34>

myplus(y,x,z);

}

(3)

cd D:\mywork

mex exm12013_1.cpp

dir exm12013_1.*

exm1213_1.cpp exm1213_1.dll

(4)

a=0.111;b=0.222;

c=exm12013_1(a,b)

c =

0.3330

12.1.4C MEX文件的执行流程

12.1.5编写C MEX文件的常用库函数和示例

12.1.5.1常用的MEX库函数

(1)

#include "mex.h"

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])

{

/* 其他C源码……*/

}

(2)

#include "mex.h"

void mexErrMsgTxt(const char *error_msg);

void mexWarnMsgTxt(const char *warning_msg);

(3)

#include "mex.h"

int mexCallMATLAB(int nlhs, mxArray *plhs[], int nrhs,

mxArray *prhs[], const char *command_name);

(4)

#include "mex.h"

int mexEvalString(const char *command);

(5)

#include "mex.h"

mxArray *mexGetVariable(const char *workspace, const char *var_name);

int mexPutVariable(const char *workspace, const char *var_name, mxArray *array_ptr);

12.1.5.2常用的MX函数

(1)

#include "matrix.h"

mxArray *mxCreateNumericMatrix(int m, int n, mxClassID class,

mxComplexity ComplexFlag);

(2)

#include "matrix.h"

int mxGetM(const mxArray *array_ptr);

int mxGetN(const mxArray *array_ptr);

void mxSetM(mxArray *array_ptr, int m);

void mxSetN(mxArray *array_ptr, int m);

(3)

#include "matrix.h"

double *mxGetPr(const mxArray *array_ptr);

double *mxGetPi(const mxArray *array_ptr);

void mxSetPr(mxArray *array_ptr, double *pr);

void mxSetPi(mxArray *array_ptr, double *pr);

(4)

#include "matrix.h"

#include

void *mxCalloc(size_t n, size_t size);

12.1.5.3编程示例

【例12.1.5.3-1】创建一个C语言MEX文件,实现对MATLAB两个“单行”字符串的合并。本例演示:(A)如何根据MATLAB约定的规则编写 C MEX源码;(B)如何构成该文件的调用指令;(C)如何为MEX文件编写在线帮助文件。(1)

#include "mex.h" //<1> #include "string.h" //<2>

//-------------------------------------------------

void stringplus(char *input_buf0,char *input_buf1,char *output_buf)

{

strcat(output_buf,input_buf0);

strcat(output_buf,input_buf1);

}

//-------------------------------------------------

void mexFunction(int nlhs,mxArray *plhs[], int nrhs,const mxArray *prhs[])

//<10>

{

char *input_buf0,*input_buf1,*output_buf;

int buflen,buflen0,buflen1,status;

if (nrhs!=2) //<13> mexErrMsgTxt("Two inputs inquired."); //<14> else if (nlhs>1) //<15> mexErrMsgTxt("Too many output arguments."); //<16>

if (mxIsChar(prhs[0])!=1||mxIsChar(prhs[1])!=1) //<17> mexErrMsgTxt("Inputs must be a string.");

if (mxGetM(prhs[0])!=1||mxGetM(prhs[1])!=1) //<19> mexErrMsgTxt("Inputs must be a row vector.");

buflen0=(mxGetM(prhs[0])*mxGetN(prhs[0]))+1; //<21> buflen1=(mxGetM(prhs[1])*mxGetN(prhs[1]))+1; //<22> buflen=buflen0+buflen1-1;

input_buf0=(char *)mxCalloc(buflen0,sizeof(char));

input_buf1=(char *)mxCalloc(buflen1,sizeof(char));

output_buf=(char *)mxCalloc(buflen,sizeof(char));

//

status=mxGetString(prhs[0],input_buf0,buflen0); //<30> if (status!=0)

mexWarnMsgTxt("Not enough space,String is truncated.");

//

status=mxGetString(prhs[1],input_buf1,buflen1); //<34> if (status!=0)

mexWarnMsgTxt("Not enough space,String is truncated.");

stringplus(input_buf0,input_buf1,output_buf);

//

plhs[0]=mxCreateString(output_buf); //<39> return;

}

(3)

cd d:\mywork

mex exm120153_1.cpp

(4)

根据以上分析,就可以写出下列exm120153_1.m文件:

% exm120153_1.m Two strings are concatenated into a larger string.

% Cstr=exm120153_1(Astr, Bstr) 把字符串Astr 和Bstr 水平串联 % Astr 被串联的“单行”字符串 % Bstr 被串联的“单行”字符串

% Cstr 由Astr 在前,Bstr 在后,串联而成的字符串。

% 2002年11月编写

(5)

A='1234';B='abcd'; C=exm120153_1(A,B)

C =

1234abcd

【例12.1.5.3-2】用C 语言编写MEX 源码文件,在运行中实现对MATLAB 函数的调用,画出了)2cos(13.0t e

y t

--=曲线。本例演示:(A )如何在MEX 文件

中调用MATLAB 的内建指令;(B )如何在MEX 文件中调用用户的自编M 文件。 (1)

#include "mex.h" #define MAX 1000

//-------------------------------------------------

void fill( double *pr, int *pm, int *pn, int max ) { int i;

*pm = max/2; *pn = 1;

for (i=0; i < (*pm); i++) pr[i]=i*(4*3.14159/max); }

//-------------------------------------------------

void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) {

int m, n, max=MAX; mxArray *rhs[1], *lhs[1];

rhs[0] = mxCreateDoubleMatrix(max, 1, mxREAL);

fill(mxGetPr(rhs[0]), &m, &n, MAX);

mxSetM(rhs[0], m);

mxSetN(rhs[0], n);

mexCallMATLAB(1, lhs, 1, rhs, "mexzzy");

mexCallMATLAB(0, NULL, 1, lhs, "plot");

mxDestroyArray(rhs[0]);

mxDestroyArray(lhs[0]);

return;

}

(2)

cd d:\mywork

mex exm120153_2.cpp

(3)

exm120153_2

图12.1-2

12.2MAT数据文件的应用

12.2.1数据的输入输出方法

12.2.2创建MAT文件的C源码程序的编写

【例12.2.2-1】目标:用C++编写一个可创建MAT文件的独立应用程序exm12022_1.exe。通过该例演示:(A)可创建MAT文件的独立应用程序的编写步骤;(B)相应C++源程序的基本格式;(C)相应mx-函数和C指令的配合应用。

(D)MAT库函数matClose, matGetArray, matOpen, matPutArray, matPutArrayAsGlobal的使用方法;

(1)

#include

#include "mat.h"

#include

#define BUFSIZE 255

//----------------------------------------------------------

int create(const char *file)

{

//

MATFile *pmat;

mxArray *pa1, *pa2, *pa3;

double data[9] = { 1.0, 4.0, 7.0, 2.0, 5.0, 8.0, 3.0, 6.0, 9.0 };

char str[BUFSIZE];

printf("Creating file %s...\n\n", file);

pmat = matOpen(file, "w");

if (pmat == NULL)

{

printf("Error creating file %s\n", file);

printf("(do you have write permission in this directory?)\n");

return(1);

}

pa1 = mxCreateDoubleMatrix(3,3,mxREAL);

mxSetClassName(pa1, "LocalDouble");

pa2 = mxCreateDoubleMatrix(3,3,mxREAL);

mxSetClassName(pa2, "GlobalDouble");

memcpy((void *)(mxGetPr(pa2)), (void *)data, sizeof(data));

pa3 = mxCreateString("MATLAB: the language of technical computing"); mxSetClassName(pa3, "LocalString");

matPutVariable(pmat,"LocalDouble", pa1);

matPutVariableAsGlobal(pmat,"GlobalDouble", pa2);

matPutVariable(pmat, "LocalString",pa3);

memcpy((void *)(mxGetPr(pa1)), (void *)data, sizeof(data));

matPutVariable(pmat,"LocalDouble", pa1);

mxDestroyArray(pa1);

mxDestroyArray(pa2);

mxDestroyArray(pa3);

if (matClose(pmat) != 0)

{

printf("Error closing file %s\n",file);

return(1);

}

//

pmat = matOpen(file, "r");

if (pmat == NULL)

{

printf("Error reopening file %s\n", file);

return(1);

}

pa1 = matGetVariable(pmat, "LocalDouble");

//

if (pa1 == NULL)

{

printf("Error reading existing matrix LocalDouble\n");

return(1);

}

if (mxGetNumberOfDimensions(pa1) != 2)

{

printf("Error saving matrix: result does not have two dimensions\n");

return(1);

}

pa2 = matGetVariable(pmat, "GlobalDouble");

//

if (pa2 == NULL)

{

printf("Error reading existing matrix GlobalDouble\n");

return(1);

}

if (!(mxIsFromGlobalWS(pa2)))

{

printf("Error saving global matrix: result is not global\n");

return(1);

}

pa3 = matGetVariable(pmat, "LocalString");

//

if (pa3 == NULL)

{

printf("Error reading existing matrix LocalString\n");

return(1);

}

mxGetString(pa3, str, 255);

if (strcmp(str, "MATLAB: the language of technical computing"))

{

printf("Error saving string: result has incorrect contents\n");

return(1);

}

mxDestroyArray(pa1);

mxDestroyArray(pa2);

mxDestroyArray(pa3);

if (matClose(pmat) != 0)

{

printf("Error closing file %s\n",file);

return(1);

}

printf("Done\n");

return(0);

}

//--------------------------主程序-------------------------------

int main()

{

int result;

result = create("mattest.mat");

return (result==0)?EXIT_SUCCESS:EXIT_FAILURE;

}

(2)

cd d:\mywork

mcc -p exm12022_1.cpp

(3)

clear

cd d:\mywork !exm12022_1

Creating file mattest.mat... Done

load mattest.mat who

Your variables are:

GlobalDouble LocalDouble LocalString

GlobalDouble,LocalDouble,LocalString

GlobalDouble = 1 2 3 4 5 6 7 8 9 LocalDouble = 1 2 3 4 5 6 7 8 9 LocalString =

MATLAB: the language of technical computing

12.3 MATLAB 引擎技术的应用

12.3.1 MATLAB 引擎概念和功用

12.3.2 引擎库函数及C 源码应用程序的编写

【例12.3.2-1】用C 语言编写调用MATLAB 引擎计算三次多项式523

+-x x 根的源程序。 (1)

#include #include #include #include "engine.h"

int PASCAL WinMain (HANDLE hInstance, HANDLE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)

{

Engine *ep;

mxArray *P=NULL,*r=NULL;

char buffer[301];

double poly[4]={1,0,-2,5};

if (!(ep=engOpen(NULL))) {

fprintf(stderr,"\nCan't start MATLAB engine\n");

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=roots(p)");

MessageBox(NULL,buffer,"exm12032_1展示MATLAB引擎的应用",MB_OK);

engClose(ep);

mxDestroyArray(P);

return EXIT_SUCCESS;

}

(2)

cd d:\mywork

mex -f D:\MATLAB6p5\bin\win32\mexopts\msvc60engmatopts.bat exm12032_1.c (3)

图 12.3-1

【例12.3.2-2】MATLAB引擎综合应用实例。本例演示:(A)MATLAB引擎对用户自编M函数文件的调用;(B)借用DOS界面作为MATLAB的指令输入和结果发布窗。

(1)

#include

#include

#include

#include "engine.h"

#define BUFSIZE 512

int main()

{

Engine *ep;

mxArray *Pz = NULL, *result = NULL;

char buffer[BUFSIZE];

double zeta[4] = {0.2, 0.4, 0.8, 1.2 }; //MATLAB环境外数据示例

if (!(ep = engOpen("\0"))) //开启本地MATLAB引擎,如失败给出警告。<12> {

fprintf(stderr, "\nCan't start MATLAB engine\n");

return EXIT_FAILURE;

}

//----------------------------------------------------------------------------------------------------------------

//程序段1:

//----------------------------------------------------------------------------------------------------------------

Pz = mxCreateDoubleMatrix(1, 4, mxREAL);

mxSetClassName(Pz, "z");

memcpy((void *)mxGetPr(Pz), (void *)zeta, sizeof(zeta));

engPutVariable(ep, Pz);

engEvalString(ep, "engzzy(z);"); //<25>

printf("按Enter键继续!\n\n");

fgetc(stdin);

printf("程序段1运行已经结束。下面处于程序段2运行过程中!\n"); mxDestroyArray(Pz);

engEvalString(ep, "close;");

//----------------------------------------------------------------------------------------------------------------

//程序段2:

//

//

//----------------------------------------------------------------------------------------------------------------

engOutputBuffer(ep, buffer, BUFSIZE);

while (result == NULL) {

char str[BUFSIZE];

printf("注意:\n");

printf("·此界面上,可输入任何MATLAB指令。\n");

printf("·若想退出,请对Exit变量赋任何数值。\n");

printf(">> ");

fgets(str, BUFSIZE-1, stdin);

engEvalString(ep, str);

printf(" %s", buffer);

if ((result = engGetArray(ep,"Exit")) == NULL)

printf("可继续运行!\n");

}

printf("运行结束!\n");

mxDestroyArray(result);

engClose(ep);

return EXIT_SUCCESS;

}

(2)

cd d:\mywork

mex -f D:\MATLAB6p5\bin\win32\mexopts\msvc60engmatopts.bat exm12032_2.c (3)

图12.3-2

图12.3-3

12.3.3利用VC++ 6.0集成环境编写MATLAB引擎程序

【例12.3.3-1】利用VC++6.0集成编程界面编写综合运用MAT数据文件和MATLAB引擎技术的(求矩阵的奇异值)C++源码程序。本例演示:(A)如何利用VC++6.0集成编程界面编写源码程序;(B)编译链接产生EXE文件所需的间夹文件。

(1)

图12.3-4

图12.3-5

图12.3-6

图12.3-7

(2)

#include "engine.h"

#include "mat.h"

#include

#include

#include

#include

void main()

{

double * b,a[9]={1,4,7,2,5,8,3,6,9};

const char *file="mymat.mat";

mxArray *Ain,*Aout,*SV;

Engine * ep;

MATFile *mat;

//--------------------------------------------------------------

mat=matOpen(file,"w");

Ain = mxCreateDoubleMatrix(3,3,mxREAL); mxSetClassName(Ain,"z");

memcpy((char *)mxGetPr(Ain),(char *)a,9*sizeof(double));

matPutVariable(mat,"z",Ain);

matClose(mat);

mxDestroyArray(Ain);

//--------------------------------

mat=matOpen(file,"r");

Aout =matGetVariable(mat,"z");

if(ep=engOpen(NULL))

{

engPutVariable(ep,Aout);

engEvalString(ep,"sv=svd(z);");

SV=engGetVariable(ep,"sv");

b=mxGetPr(SV);

cout<<"奇异值为";

cout<<"\n";

for(int i=0;i<3;i++)

{

cout<

}

engClose(ep);

matClose(mat);

mxDestroyArray(Aout);

mxDestroyArray(SV);

}

VB与MATLAB接口的实现

VB与MATLAB接口的实现: https://www.360docs.net/doc/cd16083268.html, 实例说明 在本实例中,我们制作一个能够与Matlab进行交互的应用程序。程序运行结果如图78-1所示。 图78-1 运行结果 技术要点 z引用Matlab库 z执行Matlab命令 z结束Matlab 实现过程 ■ 新建项目 打开Visual https://www.360docs.net/doc/cd16083268.html,,选择“新建项目”,在项目类型窗口中选择“Visual Basic项目”,在模板窗口中选择“Windows应用程序”,在名称域中输入“CnMatlab”,然后选择保存路径。单击“确认”。 ■ 添加控件 向当前窗体添加五个Button按钮,两个Picture控件,一个Label控件,一个Hscroll控件和一个Vscroll控件。单击菜单“项目|添加引用”,选中“Matlab Automation(Version5.3)Type Library”这一项。 注意:本程序只能在安装有Matlab的机器上运行。 ■ 设置属性 将Label控件和Command按钮的Text属性设置为与界面一致。在此不再赘述。 ■ 添加代码 Dim str1 As String ' 显示正弦图 Private Sub Command1_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Command1.Click Dim matlab As Object matlab = CreateObject("matlab.application") matlab.MinimizeCommandWindow()

MATLABAPI详解

MATLAB、API详解 【例12.1.4-1】有一个绘圆的M脚本文件circle.m如下。希望获得一个MEX绘圆程序。(1)原始的绘圆脚本文件 [circle.m] clf;r=2;t=0:pi/100:2*pi;x=r*exp(i*t); plot(x,'r*');axis('square') (2)对这脚本文件直接编译将因错误而失败 mcc -x circle ??? Error: File "circle" is a Script M-file and cannot be compiled with the current Compiler. Error in ==> H:\MATLAB53\toolbox\compiler\mcc.dll (3)把脚本文件改写成函数文件。 [circle_f.m]: function circle_f(r) clf;t=0:pi/100:2*pi;x=r*exp(i*t); plot(x,'r*');axis('square') (4)再对circle_f.m进行编译,将顺利通过。 mcc -x circle_f %mcc是编译指令,详见12.4节。 (5)运行生成的MEX文件circle_f.dll circle_f(0.5) %调用circle_f绘制一半径为0.5的圆 which circle_f %查询所调用的circle_f的路径全称。

图 12.2.1-1 【Select MATLAB Componets】对话窗的选项局部图 图 12.2.2.1-1 为产生MEX文件所产生的配置屏1

图 12.2.2.1-2 为产生MEX文件所产生的配置屏2 12.1.1.1配置正确性的验证 (1)mex应用程序的验证 cd d:\mywork %把用户目录指定为当前目录 mex my_yprime.c %由my_yprime.c文件生成my_yprime.dll文件my_yprime(1,1:4) %运行my_yprime.dll文件 which my_yprime %获得my_yprime.dll文件的位置信息 ans = 2.0000 8.9685 4.0000 -1.0947 d:\mywork\my_yprime.dll (2)在MATLAB命令窗中验证mcc应用程序 mcc -x my_yprime_m%<1> my_yprime_m(1,1:4) which my_yprime_m ans = 2.0000 8.9685 4.0000 -1.0947 d:\mywork\my_yprime_m.dll (3)在 DOS提示符后验证mex、mcc应用程序

MATLAB与FPGA的接口

FPGA器件的开发平台与MATLAB接口仿真 2007-09-03 16:24 FPGA器件的开发平台与MATLAB接口仿真 中南财经政法大学信息学院周巍武汉大学电气工程学院张志杰引言 现场可编程逻辑门阵列FPGA器件的出现是超大规模集成电路技术和计算机辅助设计技术发展的结果。FPGA器件集成度高、体积小,具有通过用户编程实现专门应用功能。 它允许电路设计者利用基于计算机的开发平台,经过设计输入、仿真、测试和校验,直到达到预期的结果。目前使用最多的Quartus II 软件支持几乎所有的EDA工具,并且可以通过命令行或Tcl脚本与第三方EDA工具之间进行无缝连接。但在很多工程设计应用中,由FPGA器件完成的主程序中只完成大量的数学运算,程序调试时以二进制输出的信号可视性差,给设计人员进行仿真、调试带来了很多不便。对于很多工程设计人员来说MATLAB是一种熟悉的具有强大的运算功能和波形仿真、分析功能的软件,如果能将FPGA与MA TLAB接口,就可以快速、准确、直观地对FPGA程序进行校验和仿真,尤其在波形信号处理等工程应用领域具有实际意义。 Quartus II 开发软件 Altera公司的QuartusII软件提供了可编程片上系统(SOPC)设计的一个综合开发环境。Quartus II 开发工具人机界面友好、易于使用、性能优良,并自带编译、仿真功能。QuartusII 软件支持VHDL和Verilog硬件描述语言的设计输入、基于图形的设计输入方式以及集成系统级设计工具。QuartusII软件可以将设计、综合、布局和布线以及系统的验证全部都整合到一个无缝的环境之中,其中也包括和第三方EDA工具的接口。QuartusII设计软件根据设计者需要提供了一个完整的多平台开发环境,它包含整个FPGA和CPLD设计阶段的解决方案。图1说明了QuartusII软件的开发流程。 在实际应用设计中,对程序原理性及可执行性的验证主要集中在程序修改阶段,尤其在

labview与matlab接口的方法

LabVIEW与Matlab接口的方法 The Method of Interfacing Between LabVIEW and Matlab 陈金平 (新疆大学,乌鲁木齐 830008) 0 引言 虚拟仪器技术是计算机技术、现代测控技术和电子仪器技术相互结合、渗透的产物。在虚拟仪器系统中,数据的分析处理、控制、结果输出和用户界面等功能都由软件完成,硬件仅仅是为了解决信号的输入输出,因此,软件是整个仪器系统的核心,从某种意义上可以说:“软件即仪器”。虚拟仪器系统的软件设计可以采用通用的可视化编程语言,如Visual C++、Visual Basic、Delphi等,但更为方便高效的还是专用的虚拟仪器软件开发平台,如美国国家仪器公司(National Instruments,NI)的Lab2 VIEW、LabW indows/C VI,惠普公司的VEE等,而其中首推NI公司的图形化编程语言LabVIEW。 1 LabVIEW的功能及特点 LabVIEW是NI公司推出的一种虚拟仪器软件开发平台,自1986年正式推出,经过短短不到15年的时间,已经发展到以最新板本LabVIEW611为核心,包括控制与仿真、高级数字信号处理、统计过程控制、模糊控制和PID控制等众多附加软件包,运行于W indows NT/98、Linux、M acintosh、Sun和HP-UX等多种平台的工业标准软件开发环境。 LabVIEW在包括航空航天、通信、汽车、半导体和生物医学等众多领域内得到了广泛的应用。其最大的特色是采用编译型图形化编程语言———G语言(G raph2 Pro gramm ing),即用户设计好程序的大体框架后,如同画流程图一般,只需将系统提供的各种图形化功能模块连接起来,就可得到所需的应用软件。LabVIEW中的程序称为VI(virtual instruments),每个VI都由前面板和框图程序以及图标/连接端口三部分组成。 除了具备其它编程语言所提供的常规函数功能外,LabVIEW内部还集成了大量的生成图形界面的模板,如各种表头、旋钮、开关、LE D指示灯、图表等;丰富实用的数值分析、信号处理功能,如FFT变换、各种滤波器、信号发生器等;以及对RS-232、G PI B、VXI、数据采集板卡、网络等多种硬件的设备驱动功能,并免费提供数十家世界知名仪器厂商的几百种源码级仪器驱动,大大方便和简化了用户的设计开发工作。Lab2 VIEW使得过去繁琐、枯燥的软件开发变得简单、方便,尤其适合不熟悉传统文本编程语言(如C、BASIC等)的工程技术人员,被誉为工程师和科学家的语言。 但是,在大型的系统测试和仿真过程中,需要软件进行一些很复杂的数值计算时,LabVIEW的图形化编程语言就显得力不从心,M atlab是一种常用的高效率数学运算工具,它建立在向量、数组和复数矩阵的基础上,使用方便,将它和LabVIEW有机地结合起来会大大减少编程的工作量,提高编程效率。本文通过求解一常微分方程初值问题的例子,介绍了两种编程语言的接口方法。 2 在LabVIEW中调用Matlab语言的方法在测试系统设计和软件开发过程中,数学分析与信号处理是两个不可缺少的重要内容。LabVIEW将数据采集和测试分析中常用的数学和信号分析算法程序集成在一起,提供了先进的数学和信号分析环境,所有的数学分析节点都集中在M athematics子模板中。在此模板中有一M atlab Script节点,利用此节点就可以实现在LabVIEW中对M atlab语言的调用。下面通过具体例子介绍调用方法。举例如下: 用Runge2K utta法计算下列微分方程的解(初值问题): y′=-50y+50x2+2x , 0≤x≤1 y(0)=1 2.1 编制M文件 启动M atlab610,利用其M文件编辑器编写M文件如下: function y=ff2(x,y) y=-50?y+50?x?x+2?x; 35 LabVIEW与M atlab接口的方法 陈金平

Matlab编程以及接口

Matlab编程的初步知识: 1.M脚本文件 Matlab命令集合; 无需输入和输出变量; 与其它脚本文件之间变量透明,即共同使用Matlab的工作空间。 比如 例1: x = (1:10); y =sin(x); plot(x,y) 例2: A = magic (4); B = A'; [C,D = xtimesAB(A,B); 2.函数 同样也是完成具体任务的指令集合,但是用一个名字封装起来,变量对外不透明,需要借助输入变量提供数据,输出变量给出结果。执行完毕后,所用的内存全部释放给Matlab。这样的命令集合体称为函数,封装的名字称为函数名,输入变量和输出变量在函数名前后指定。比如例2的xtimesAB(A,B)定义如下: function [C,D] =xtimesAB(A,B) % % This function can tell the products of e-e and V-C % C = A.*B; D = A*B; end 其中,函数名为xtimesAB,输入变量为A,B;输出变量为C,D。函数名下面%开头的部分为注释内容。在Matlab环境下,可以通过help xtimesAB来显示。 还有一种简单的函数,即inline函数,其特点是随用随定义。比如 1.>> myfun = ‘1+log(r) ‘; 2.>> myfuni=inline(myfun,’r’) 3.>>a=feval(myfuni,10) 4.结果a = 3.3026

我们用得最多的,就是像xtimesAB这样的M函数。与上面这个inline函数对应的M函数为 function y=myfun(r) y=1+log(r); 该函数结尾不含有end,即Matlab不要求必须有end。 使用时,在Matlab命令环境下,直接书写函数名,并给出输入变量,即可以工作。但需要注意的是,Matlab调用的是文件名而不是函数名。但一般两者取一样的名字。因此,关键是文件名。 M函数的流程控制简介如下: I. 循环 5.while a)while condition b)命令语句 c)end 6.for a)for i=1:n b)语句 c)end ii.条件 1.if a)if condition 1 b)语句 c)elseif condition2 d)语句 e)else f)语句 g)end 2.switch a)switch 表达式 b)case case1 c)语句 d)case case2 e)语句 f)otherwise g)语句 h)End iii.跳过:continue iv.跳出:break

第13章 MATLAB外部程序接口技术_习题答案

1 第13章 MATLAB 外部程序接口技术 习题13 一、选择题 1.要在Word 环境下调用MATLAB 的命令,需要调用Word 的( )模板。B A .Normal B .M-Book C .自由格式 D .空白文档 2.在Excel 环境下加载Spreadsheet Link 程序后,会在Excel 窗口的“开始”选项卡中增加一个( )命令组。D A .Excel B .Spreadsheet C .Link D .MATLAB 3.打开一个可读可写的文本文件,其打开方式为 。A A .rt+ B .r+ C .rwt D .a 4.以下选项中,用于定义指向MAT 文件指针的命令是( )。A A .MA TFile *p; B .MAT *p; C .File *p; D .FIL E *p; 5.关于MATLAB 引擎,下列说法中不正确的是( )。C A .利用MA TLA B 引擎,可以在 C 程序中调用MA TLAB 的函数。 B .通过MATLAB 引擎,可以提高开发应用程序的效率。 C .通过MA TLAB 引擎,可以在MA TLAB 中直接调用用C 语言编写的函数 D .包含MA TLAB 引擎函数的程序的执行效率减低。 二、填空题 1.在Word 与MATLAB 之间进行传递的内容称为 ,由M-Book 文档传向MATLAB 的命令称为 ,M-Book 文档中的MATLAB 命令的执行结果称为 。单元(Cell ),输入单元(Input Cell ),输出单元(Output Cell ) 2.Excel 和MA TLAB 的交互操作,通过 程序来实现。Spreadsheet Link 3.MA TLAB 文件操作的基本步骤是,先 文件,在对文件进行 ,最后 文件。打开,读写,关闭 4.对MAT 文件进行操作的C 程序中,一定要包含 头文件。mat.h 5.MEX 函数在头文件 中得到声明。mex.h 三、应用题 1.在MA TLAB 中创建一个100 × 200的随机矩阵,然后将数据导入到Excel 表格中,在Excel 中调用MATLAB 的差分函数按列进行差分运算。 2.已知)2ln(x y + =π,当x 取-3.0、-2.9、-2.8、…、2.8、2.9、3.0时,求各点的 函数值。要求: (1)将函数值输出到一个数据文件中。

在MATLAB环境下访问外部函数的共享库文件

在MA TLAB环境下访问外部函数的共享库文件,必须首先把该库文件加载到内存中。一旦加载成功,就能直接在MA TLAB中直接请求关于函数的任何信息。而当不再需要该库时,就应当及时把库文件从内存中卸载以节省内存开销。 加载库 语法:loadlibrary(…shrlib?,?hfile?) 其中shrlib为加载的动态链接库文件名(filename.dll),hfile为头文件名,它包含函数原型。例如,当加载包含MA TLAB中mx程序的libmx库时,可以使用下列语句。 hfile=[matlabroot?\extern\include\matrix.h?]; loadlibray(…libmx?, hfile) 卸载库 语法:unloadlibrary libmx 使用两个函数可以获取加载库的信息: libfunctions(…libname?) or libfunctions libname libfunctionsview(…libname?) or libfunctionsview libname 这两个函数的不同之处在于显示结果的方式不同,后者是以图形的方式显示在新的窗口中。而前者返回库libmx中有哪些可用的函数。请看示例: libfunctions libmx Methods for class lib.libmx: mxAddField mxGetFieldNumber mxIsLogicalScalarTrue mxArrayToString mxGetImagData mxIsNaN mxCalcSingleSubscript mxGetInf mxIsNumeric mxCalloc mxGetIr mxIsObject mxClearScalarDoubleFlag mxGetJc mxIsOpaque mxCreateCellArray mxGetLogicals mxIsScalarDoubleFlagSet 如果加上命令开头-full,则可以显示函数返回值的细节。 libfunctions libmx -full Methods for class lib.libmx: [mxClassID, MA TLAB array] mxGetClassID(MA TLAB array) [lib.pointer, MA TLAB array] mxGetData(MA TLAB array) [MA TLAB array, voidPtr] mxSetData(MA TLAB array, voidPtr) [lib.pointer, MA TLAB array] mxGetPr(MA TLAB array) [MA TLAB array, doublePtr] mxSetPr(MA TLAB array, doublePtr) uint8 mxIsFinite(double) uint8 mxIsInf(double) 值得注意的是,这两个函数返回值的类型均是MA TLAB的数据类型,虽然函数是利用C语言编写的。调用库函数 一旦库函数被加载到了内存空间,只要指定库名、函数名和变量就可以使用calllib函数调用库中的任何函数了。语法格式: calllib(…libname?,?funcname?,arg1,…,argn) 下列语句显示如何操作: hfile=['C:\MA TLAB7\extern\include\matrix.h'];

MAtlab7.0.4接口完整详细解释并给出多种简易示例

Matlab7.0.4 接口连接说明。PSCAD使用的4.2.1教育版,网络版。 对于大小写的要求,对于系统的变量需要正常的大小写。用户自定义的不需要注意。 切记:每个有MA TLAB的工程都需要设置一下链接,那个勾一定要勾上啊,害了我几天。否则会报错的。如下: 不勾就会报错: 下面的两个设置是一次设置就可以保存的。 1.设置fortran编译器,不能使用GUN编译器,因为它只能用在fortran77中,我用的下面的版本。VF6.6专业版。

在PSCAD中如下设置:

2.设置MA TLAB,对于7.0.4已经可以正常运行。

3.PSCAD系统设置完成后,就可以建case了,开始加模块了。下面是我做的一个简单测试模块。单输入单输出。已成功运行。 testmat1.m :文件如下: function [I1]=testIO(in1)

I1=in1; 模块的制作如下: 首先建立一个模块,这个就自己建了。 上面的三个参数是可以自己改的, 第一个参数是m函数的文件名。 第二个参数是相对路径,即m函数所在的文件夹名,建议仿系统示例目录形式。

第三个参数是不一定需要的。前面两个参数主要是用于调用m函数,表示路径和文件名。 下面是编写的脚本文件,是在DSDYN中。 #STORAGE REAL:2 #LOCAL INTEGER I_CNT STORF(NSTORF) = $INPUT CALL MLAB_INT("%:Dir\$Path", "$Name", "R" , "R") $OUTPUT = STORF(NSTORF+1) NSTORF = NSTORF + 2 联合数组多输入多输出: 首先建立一个INPUT,一个OUTPUT,可以是多维的,下面是一个2维输入输出。注意,这里只有一个变量,使用数组表示,此数组下标是从1开始的。在m文件中也是使用数组。 在main中使用数据组合和分离器。

wind量化MATLAB接口功能

MATLAB接口主要功能是读取数据并且支持一些基本的函数运算。 1. windmatlab 创建windmatlab数据提取对象; 比如w=windmatlab,即可创建w对象句柄。 help windmatlab,即可查看windmatlab各类接口命令说明。 2. menu 用来显示wind数据向导工具条,也可以指定只显示特定的向导窗体。 比如w.menu(‘wsd’),即只显示wsd向导窗体。 查看menu说明,可以输入help windmatlab/menu 3. isconnected 用来确定创建的wind data object对象是否成功登陆。 比如x=isconnected(w),即判断wind对象w是否已经登陆成功。 4. cancelRequest 可以根据创建的数据请求id,取消数据请求。 比如你订阅了实时数据,返回reqid,那么想取消订阅,则可以通过如下命令行: w.cancelRequest(reqid) 5. wsd 返回选定证券品种的历史序列数据,包括日间的行情数据,基本面数据以及技术数据指标。 [data,codes,fields,times,errorid,reqid] = w.wsd(windCodes,windFields,startTime,endTime,v arargin) 其中,Data返回序列数据结果集。 Codes返回提取数据的WindCode代码。 Fields返回提取的指标名。 Times返回时间序列。 errorID返回错误ID号。 reqID返回请求ID号。

6. wsi 返回指定品种的日内分钟K线数据,包含历史和当天,分钟周期可以指定,技术指标参数可以自定义设置; [data,codes,fields,times,errorid,reqid] = w.wsi(windCodes,windFields,startTime,endTime,va rargin) 7. wst 返回日内盘口买卖十档快照数据和分时成交数据; [data,codes,fields,times,errorid,reqid] = w.wst(windCodes,windFields,startTime,endTime,va rargin) 8. wss 返回指定品种的历史截面数据,比如取沪深300只股票的2012年3季度的净利润财务指标数据;[data,codes,fields,times,errorid,reqid] = w.wss(windCodes,windFields,varargin) 9. wsq 可以返回当天实时指标数据,数据可以一次性请求,也可以通过订阅的方式获取当日实时行情数据; ?一次性请求实时行情数据: [data,codes,fields,times,errorid,reqid] = w.wsq(windCodes,windFields) ?订阅实时行情数据: [data,codes,fields,times,errorid,reqid] = w.wsq(windCodes,windFields,callback) 其中callback为回调函数,用来指定实时指标触发时执行相应的回调函数; 10. wset 返回数据集,包括板块成分、指数成分、ETF申赎成分信息、分级基金明细、融资标的、融券标的、融资融券担保品、回购担保品、停牌股票、复牌股票、分红送转。参数设置为起止日期、板块名称等。[data,codes,fields,times,errorid,reqid]=w.wset(windCodes windFields, varargin) 注意:wset、wpf、tdays、tdaysoffset、tday函数第二个与第四个输出变量没有实际意义,仅仅是为了保持与wsd、wss、wst、wsq函数输出格式的统一性。

915200-MATLAB程序设计与应用-第13章 MATLAB外部程序接口技术__源程序

第13章MATLAB外部程序接口技术 例13-1计算当x=[0.0,0.1,0.2,…,1.0]时,f(x)=e x的值,并将结果写入文件demo1.txt。 程序如下: x=0:0.1:1; Y=[x;exp(x)]; fid=fopen('demo1.txt','w'); fprintf(fid,'%6.2f %12.8f\n',Y); fclose(fid); 例13-2 读出例13-1生成的文件demo1.txt中的数据。 程序如下: fid=fopen('demo1.txt','r'); while 1 line=fgetl(fid); if line<0 break end disp(line) end fclose(fid); 例13-3假定文件textdemo.txt中有以下格式的数据: Name English Chinese Mathmatics Wang 99 98 100 Li 98 89 70 Zhang 80 90 97 Zhao 77 65 87 此文件第一行为标题行,第2~5行的第1列为字符型,后3列为整型。从该文件中将前3个数据读入到grades的程序段如下: fid=fopen('textdemo.txt','r'); grades=textscan(fid,'%s %d %d %d',3,'headerlines',1); 例13-4 假设文件alphabet.txt的内容是按顺序排列的26个大写英文字母,读取前5个字母的ASCII和这5个字符。 程序如下: fid=fopen('alphabet.txt','r'); c=fread(fid,5); frewind(fid); d=fread(fid,5,'*char'); fclose(fid); 1

Matlab_Simulink_接口

?IMAGINE SA 1998-2006 AME_INT2 Matlab ?& Simulink ?接口 法国伊梦镜公司上海代表处

2 ?IMAGINE SA 1998-2006 内容 ?Matlab ??AMESim ?: 采用预定义的M 文件从Matlab 中控制AMESim ?将状态空间矩阵输入至AMESim 中 ?AMESim ?→Simulink ?-S-函数: 将 AMESim 模型输入至Simulink 环境中 ?AMESim ?→Simulink ?-共仿真: AMESim 和Simulink 的共仿真

3 ?IMAGINE SA 1998-2006 9从Matlab 中采用M 文件控制AMESim 9S-函数9共仿真 AMESim ?–Matlab ?& Simulink ?接口 Use Ode15s to run this model AMESim-Simulink Standard Interface Sine entry applied to the system Xp Signal Generator for valve opening xp p1 p2 rpm sv AMESim: slink_ S-Function P2 P1 1450Constant for Pump Speed Rod displacement Pressure @ port 1 Pressure @ port 2 slink.ame

4 ?IMAGINE SA 1998-2006 Matlab ??AMESim ??AMESim ??Matlab ? 9将AMESim 的仿真结果输入至Matlab 中用于特殊的后处理 9互换传递函数(雅可比Jacobian 矩阵)9在Matlab 中获取AMESim 的参数9从Matlab 中修改AMESim 参数 9从Matlab 中修改AMESim 仿真运行参数9从Matlab 中运行AMESim 模型 ?可以从Matlab 中完全控制AMESim 仿真,例如从Matlab 中定义批处理运行或者在Matlab 中定义优化方案(除了AMESim 内置的优化功能之外)

MATLAB 应用程序接口API

MATLAB中的应用程序接口API 前面章节主要叙述MATLAB自身的各种功能和使用方法。作为优秀软件,MATLAB不仅自身功能强大、环境友善、能十分有效地处理各种科学和工程问题,而且具有极好的开放性。这开放性表现在两方面:一,MATLAB适应各科学、专业研究的需要,提供了各种专业性的工具包;二,MATLAB为实现与外部应用程序的“无缝”结合,提供了专门的应用程序接口API。遵循本书“淡化专业,面向通用”的宗旨,本章将集中阐述MATLAB的应用程序接口。本章分五节,各节内容简述如下。 第12.1节集中介绍:如何编写C MEX源码程序,也就是如何为现有的C程序编写接口程序,使之成为MATLAB函数文件;运用这种技术,读者可以把积累的优秀C程序改造成可在MATLAB中方便调用的指令。 第12.2节用于演示:如何编写产生MAT数据文件的C源码程序。读者通过算例入门,就不难借助MAT文件实现MATLAB与外部应用程序的数据交换。 第12.3节围绕MATLAB引擎技术展开。借助这种技术,前台可以是各种外部应用程序编写的界面,而后台计算则可完全交由MATLAB进行。 第12.4节用三个算例来说明如何应用ActiveX实现MATLAB与外部应用程序的通信。在第一个算例中,MATLAB用作为客户,服务器是Excel。在后两个算例中,服务器是MATLAB,而客户是PowerPoint。由此产生的PPT文件,可以在放映过程中,实时地进行MATLAB调用。 第12.5节的内容是:如何借助DDE技术在MATLAB与其他外部程序间进行通信。该节的一个算例演示:VB制作的界面如何借助DDE建立的对话通道调用服务器MATLAB进行计算和显示结果图形。而另一个算例则演示:MATLAB如何以客户身份与服务器Excel建立DDE“热连接”,使MATLAB图形实时地跟随电子表格数据的改变而变化。 值得指出:MATLAB6.0, 6.1版用于API的(MEX、MAT、及引擎)库函数许多已经被废止。本章内容是根据MATLAB6.5编写的。 12.1C语言MEX文件的编写 12.1.1关于MEX文件的一般性说明 12.1.2MEX文件中的MATLAB数据 A=['abcd';'1234';'ABCD'] A = abcd 1234 ABCD

第11章_MATLAB外部程序接口技术_例题源程序

第11章MATLAB外部程序接口技术 例11.1 假定文件textdemo.txt中有以下格式的数据: [names, x, y, z] = textread ('textdemo.txt', '%s %d %d %d', 4, 'headerlines', 1); 例11.2计算当x=[0.0,0.1,0.2,…,1.0]时,f(x)=e x的值,并将结果写入文件demo1.txt。 x=[0:0,1:1]; y=[x;exp(x)]; fid=fopen(?demo1.txt?,?w?); fprintf(fid,?%6.2f %12.8f\n?,y); fclose(fid); 例11.3将十进制数转换为十六进制数。 A=[6,10,14,44]; fprintf(…%9X\n?, A+ (A<0)*2^32) 例11.4读出例11.2生成的文件demo1.txt中的数据。 fid=fopen('demo1.txt','r'); while 1 LINE=fgetl(fid); if LINE<0 break, end; disp (LINE); end fclose(fid); 例11.5将例11.1的文件读入到grades中。 fid = fopen('textdemo.txt', 'r'); grades = textscan(fid, '%s %d %d %d', 3, 'headerlines', 1); grades{:} 例11.6假设文件alphabet.txt的内容是按顺序排列的26个大写英文字母,读取前5个字母的ASCII码和这5个字符。 fid = fopen('alphabet.txt', 'r'); c = fread(fid, 5); frewind(fid); d = fread(fid, 5, '*char'); fclose(fid);

MATLAB外部程序接口技术

第十一章MATLAB外部程序接口技术 11.1M编译器的功用和前提准备 11.2创建MEX文件 11.2.1MEX文件编译的验证 【例11.2-1】验证mex应用程序把C码文件编译成MEX文件的正确性。 (1)先将matlab\extern\examples\mex目录下的yprime.c文件复制到用户自己的工作目录(比方d:\mywork),然后将此文件名改为my_yprime.c。 (2)运行以下指令 cd d:\mywork mex my_yprime.c my_yprime(1,1:4) which my_yprime ans = 2.0000 8.9685 4.0000 -1.0947 d:\mywork\my_yprime.dll 〖说明〗 应该指出:mex的编译操作也可以象图11.2-1那样在DOS环境中进行,结果相同。 图 11.2-1 在DOS状态下进行编译操作 【例11.2-2】验证mcc应用程序把M码文件编译成MEX文件的正确性。 (1)先将matlab\extern\examples\mex目录下的yprime.m文件复制到用户自己的工作目录(比方d:\mywork),然后将此文件名改为my_yprime_m.m。 (2)运行以下指令 cd d:\mywork %把用户目录指定为当前目录 mcc -x my_yprime_m my_yprime_m(1,1:4) which my_yprime_m ans = 2.0000 8.9685 4.0000 -1.0947 d:\mywork\my_yprime_m.dll

11.2.2由M文件创建C MEX文件的算例 【例11.2-3】先编写一个“判断方阵是否奇异”的M文件,然后由该M文件生成相应的MEX文件。 (1)在MATLAB的编辑器中,编写下面的函数文件exm1.m 。 [exm1.m] function y=exm1(A) [m,n]=size(A); if m~=n; error('An input matrix should be n-by-n.') end r=rank(A); if r==m disp('This matrix is nonsigular') else disp('This matrix is sigular') end (2)把该函数文件存放于用户目录d:\mywork下。 (3)在MATLAB命令窗中,运行以下指令对exm1.m进行编译。 mcc -x exm1 %编译m文件。 (4)调用MEX文件exm1.dll 进行计算 A=[1,0,1;2,1,0;4,1,4] exm1(A) which exm1 A = 1 0 1 2 1 0 4 1 4 This matrix is nonsigular d:\mywork\exm1.dll 【例11.2-4】产生一个绘圆的MEX文件。本例演示:(A)M脚本文件不能被编译;(B)如何把脚本文件改写成函数文件;(C)改写后的M函数文件可被正确编译。 (1)原始的绘圆脚本文件 [circle.m] clf;r=2;t=0:pi/100:2*pi;x=r*exp(i*t); plot(x,'r*');axis('square') (2)对该脚本文件直接编译将因错误而失败 mcc -x circle ??? Error: File "circle" is a Script M-file and cannot be compiled with the current Compiler. Error in ==> H:\MATLAB53\toolbox\compiler\mcc.dll (3)把脚本文件改写成函数文件 [circle_f.m]: function circle_f(r) clf;t=0:pi/100:2*pi;x=r*exp(i*t); plot(x,'r*');axis('square') (4)再对circle_f.m进行编译,将顺利通过

FPGA器件与MATLAB接口仿真过

FPGA器件的开发平台与MATLAB接口仿 真 引言 现场可编程逻辑门阵列FPGA器件的出现是超大规模集成电路技术和计算机辅助设计技术发展的结果。FPGA器件集成度高、体积小,具有通过用户编程实现专门应用功能。它允许电路设计者利用基于计算机的开发平台,经过设计输入、仿真、测试和校验,直到达到预期的结果。目前使用最多的Quartus II 软件支持几乎所有的EDA 工具,并且可以通过命令行或Tcl脚本与第三方EDA工具之间进行无缝连接。但在很多工程设计应用中,由FPGA器件完成的主程序中只完成大量的数学运算,程序调试时以二进制输出的信号可视性差,给设计人员进行仿真、调试带来了很多不便。对于很多工程设计人员来说MATLAB是一种熟悉的具有强大的运算功能和波形仿真、分析功能的软件,如果能将FPGA与MATLAB接口,就可以快速、准确、直观地对FPGA程序进行校验和仿真,尤其在波形信号处理等工程应用领域具有实际意义。

Quartus II 开发软件 Altera公司的QuartusII软件提供了可编程片上系统(SOPC)设计的一个综合开发环境。Quartus II 开发工具人机界面友好、易于使用、性能优良,并自带编译、仿真功能。QuartusII软件支持VHDL和Verilog硬件描述语言的设计输入、基于图形的设计输入方式以及集成系统级设计工具。QuartusII软件可以将设计、综合、布局和布线以及系统的验证全部都整合到一个无缝的环境之中,其中也包括和第三方EDA工具的接口。QuartusII设计软件根据设计者需要提供了一个完整的多平台开发环境,它包含整个FPGA和CPLD设计阶段的解决技术方案。图1说明了QuartusII软件的开发流程。 在实际应用设计中,对程序原理性及可执行性的验证主要集中在程序修改阶段,尤其在处理的数据复杂、繁多时,Quartus II自带的波形输入仿真就很难实现程序的验证,而且输出的数据不能方便的以

相关文档
最新文档