MATLAB转换为C++程序的方法
从MATLAB代码生成独立c语言代码

Matlab 用help lsqcurvefitMATLAB Coder可以从MATLAB代码生成独立的、可读性强、可移植的C/C++代码。
使用MATLAB Coder产生代码的3个步骤:准备用于产生代码的MATLAB算法;检查MATLAB 代码的兼容性(有些matlab代码语句并不能生成c/c++代码);产生最终使用的源代码或MEX。
利用MATLAB Coder生成c++代码,并在vs2008中验证:一个简单的例子,两数相乘:1、安装matlab2011a或者更新版本;2、简单生成一个foo.m文件;function c = foo(a, b)%#codegen%This function muliplies a and bc = a * b其中,%#codegen可以防止出现警告错误3、在命令窗口,输入mex -setpu,选中一个存在的编译器;4、在命令窗口输入coder(图形界面),回车,弹出MATLAB Coder Project对话框;5、在New选项卡Name中输入一个工程名foo.prj;点击Ok,弹出MATLAB Coder MEX Function 对话框;6、在Overview选项卡中,点击Add files,弹出对话框,选中foo.m打开;7、单击变量a,选择Define by Example…,弹出MATLAB Coder Define by Example对话框,在MATLAB Expression中输入5,点击OK;同样变量b也进行相应操作,输入6;8、选中Build选项卡,Output type中选择c/c++ Static Library;选中Generate code only;9、点击More settings,GeneralàLangu age选择C++;Interface选项中去掉所有选项;Close;10、点击Build,进行编译;点击View report,弹出Code Generation Report对话框,此时,变量a、b、c会显示相应的变量信息;11、利用vs2008建立一个控制台应用程序,将生成的相关文件foo.h、foo.cpp、rtwtypes.h、foo_types.h拷到相关目录下并添加到应用程序中;12、在foo.cpp文件中添加#include “stdafx.h”;13、test.cpp文件中代码为:#include "stdafx.h"#include "foo.h"#include <iostream>using namespace std;int _tmain(int argc, _TCHAR* argv[]) {double a = 0.0, b = 0.0, c = 0.0;cin>>a>>b;c = foo(a, b);cout<<"c = "<<c<<endl;return 0;}一个复杂的例子,求一个数的n次方根:1、两个.m文件:nrt.m:function [nth_rt, iterations, hstry] = nrt(varargin)%#codegen %This function will use a Newton Search Technique to find %the nth root of a number, a, to the tolerance, tol.%The square root% nrt(10, 2), or nrt(10, 2, 1e-9)%The "n" root%nrt(10, n), or nrt(10, n, 1e-9)a = varargin{1};n = varargin{2};if nargin ~= 3tol = 1e-9;elsetol = varargin{3};endif a < 0iterations = 0;hstry = 0;else[nth_rt, hstry] = newtonSearchAlgorithm(a, n, tol);iterations = length(find(hstry ~= 0));%iterations = sum(hstry ~= 0);endnewtonSearchAlgorithm.m:function [x, h] = newtonSearchAlgorithm(b, n, tol) %#codegen %Given, "a", this function finds the nth root of a%number by finding where: x^n-a = 0coder.inline('never'); %使其生成一个单独的c++文件notDone = 1;aNew = 0; %Refined Guess Initializationa = 1; %Initial Guesscnt = 0;h = zeros(50, 1);h(1) = a;while notDone[curVal, slope] = f_and_df(a, b, n); % squareyint = curVal - slope * a;aNew = -yint / slope; %The new guessh(cnt) = aNew;if (abs(aNew-a) < tol) %Break if it's converged notDone = 0;elseif cnt > 49 %after 50 iterations, stopnotDone = 0;aNew = 0;elsea = aNew;endendx = aNew;function [f, df] = f_and_df(a, b, n)%Our function is f=a^n-b and it's derivative is n*a^(n-1).f = a^n-b;df = n*a^(n-1);2、在命令窗口输入coder(图形界面),回车,弹出MATLAB Coder Project对话框;3、在New选项卡Name中输入一个工程名nrt.prj;点击Ok,弹出MATLAB Coder MEX Function对话框;4、在Overview选项卡中,点击Add files,弹出对话框,选中nrt.m打开;5、添加三个输入,分别为10、2、1e-9;两个输入也可以;6、选中Build选项卡,Output type中选择c/c++ Static Library;选中Generate code only;7、点击More settings,General-->Language选择C++;Interface选项中去掉所有选项;Close;8、点击Build,进行编译;点击View report,弹出Code Generation Report对话框;9、利用vs2008建立一个控制台应用程序,将生成的相关文件nrt.cpp、nrt.h、newtonSearchAlgorithm.cpp、newtonSearchAlgorithm.h、nrt_types.h、rtwtypes.h拷到相关目录下并添加到应用程序中;10、分别在nrt.cpp、newtonSearchAlgorithm.cpp文件中添加#include “stdafx.h”;11、test.cpp文件中代码为:#include "stdafx.h"#include "nrt.h"#include <iostream>using namespace std;int _tmain(int argc, _TCHAR* argv[]){double varargin_1 = 0, varargin_2 = 0, varargin_3 = 1e-9;cin>>varargin_1>>varargin_2;double nth_rt = 0, iterations = 0;double hstry_data[50] = {0};int hstry_sizes[1] = {0};nrt(varargin_1, varargin_2, varargin_3, &nth_rt, &iterations, hstry_data, hstry_sizes);cout<<"nth_rt = "<<nth_rt<<endl;cout<<"iterations = "<<iterations<<endl;cout<<"hstry_data = "<<endl;for (int i=0; i<50; i++){cout<<hstry_data[i]<<endl;}cout<<"hstry_sizes = "<<hstry_sizes[0]<<endl;return 0;}。
matlab fittype用法 转c语言

matlab fittype用法转c语言一、Matlab Fittype简介Matlab是一款强大的数学软件,提供了多种工具箱用于数据处理和分析。
其中,Fittype是Matlab中用于数据拟合的工具箱之一,它可以用于将数据拟合成不同的函数形式,从而对数据进行更深入的分析。
在Matlab中,使用Fittype工具箱可以方便地将数据拟合成多种函数形式,包括线性拟合、多项式拟合等。
以下是Matlab Fittype的基本用法:1. 创建Fittype对象使用fittype函数可以创建一个Fittype对象,该对象表示要拟合的数据和拟合函数的形式。
例如,要拟合一组x和y数据,可以使用以下代码:f = fittype('x^2 + 2*x + 1');该代码将创建一个表示二次函数形式的Fittype对象。
2. 添加数据使用adddata函数可以将数据添加到Fittype对象中。
例如,要将一组x和y数据添加到上述二次函数拟合对象中,可以使用以下代码:adddata(f, xdata, ydata);其中,xdata和ydata是要添加的数据。
3. 进行拟合使用fit函数可以对Fittype对象进行拟合,并返回拟合结果的对象。
例如,要使用上述二次函数拟合对象进行拟合,可以使用以下代码:[fitresult, gof] = fit(xdata, ydata, f);该代码将返回拟合结果的对象fitresult和拟合质量指标gof。
将Matlab Fittype用法转换为C语言需要将Matlab中的函数调用转换为C语言代码。
下面是一个简单的示例代码,演示如何将Matlab Fittype用法转换为C语言:```c#include <stdio.h>#include <math.h>// Fittype对象创建和添加数据函数原型声明void create_fittype(double* x, double* y, double* f, int order);void add_data(double* f, double* xdata, double* ydata);void fit(double* xdata, double* ydata, double* f);int main() {// 示例数据double xdata[] = {1, 2, 3, 4, 5};double ydata[] = {2, 4, 5, 5.5, 7};double x = 0; // x坐标数组的起始地址double y = 0; // y坐标数组的起始地址double f = 0; // Fittype对象变量名,表示要拟合的函数形式int order = 2; // 多项式次数,表示要拟合的函数形式为二次函数形式int n = sizeof(xdata) / sizeof(xdata[0]); // 数据点个数double error = 1e-6; // 误差阈值,用于判断是否收敛double tol = 1e-6; // 迭代收敛的容差值,用于优化拟合结果的质量指标值gof_smae和gof_maeint max_iter = 100; // 最大迭代次数,用于控制拟合过程的收敛速度和精度double *result = NULL; // 用于存储拟合结果的指针变量名,后续会进行释放操作,注意不要使用局部变量指针访问该指针变量名进行输出结果操作或输出拟合结果的值,而是使用result指针变量名进行输出操作或输出拟合结果的值。
matlab封装c代码

matlab封装c代码
MATLAB 可以通过MATLAB Coder 将MATLAB 代码转换为 C 和C++ 代码。
下面是一个简单的步骤概述:
1. 准备MATLAB 代码:首先,您需要确保您的MATLAB 代码是准备好被编译的。
这可能包括使用'static' 变量和避免使用不能被MATLAB Coder 直接处理的函数或操作。
2. 启动MATLAB Coder:在MATLAB 中,使用coder 命令来启动MATLAB Coder。
3. 创建项目:在MATLAB Coder 中,创建一个新的项目,并指定项目的名称和位置。
4. 添加MATLAB 文件:将您的MATLAB 脚本添加到项目中。
5. 定义输入类型:MATLAB Coder 需要知道您的MATLAB 函数的输入参数的类型。
您可以通过定义输入类型来完成这个步骤。
6. 生成C 代码:在定义了输入类型之后,您可以使用MATLAB Coder 来生成C 代码。
7. 封装C 代码:生成的C 代码可以直接用于您的应用程序。
如果您需要将生成的代码封装到一个库中,您可能需要编写一些额外的代码来创建和管理这个库。
请注意,MATLAB Coder 并不能处理所有的MATLAB 函数或操作。
一些特殊的函数或操作可能需要用其他方式进行处理,或者可能完全不能被转换。
在进行封装之前,最好先了解清楚您的MATLAB 代码中是否包含这些不能被转换的元素。
另外,封装 C 代码的过程可能需要一些对 C 或C++ 的深入理解,包括内存管理、指针等等。
如果您不熟悉这些内容,可能需要花一些时间来学习。
MATLAB数据输入和输出 C语言转换

数据输入和输出一、概述MATLAB可读和写的文件格式:文件格式文件内容扩展名读、写文件的函数MATLAB 保存的MA TLAB工作区.mat load,save文本Text 任意textscan,textread 限定文本任意dlmread,dlmwrite 逗号分隔的数值.csv csvread,csvwriteXML XML-格式文本t .xml xmlread,xmlwriteAudio NeXT/SUN sound .au auread,auwrite Microsoft WA VE sound .mav mavread,mavwriteMovie Audio/video .avi avireadScientific data Data in Common Data Format .cdf cdfread,cdfwrite Flexible Image Transport system data .fits fitsreadData in Hierarchical Data Format .hdf hdfreadSpreadsheet Excel worksheet .xls xlsread,xlswrite Lotus 123 worksheet .wk1 wk1read,wk1writeGraphics TIFF/PNG/HDF/BMP/JPEG imageGIF/PCX/XWD/Cursor/Icon image.tiff .png .hdf .bmp .jpeg.gif .pcx .xwd .cur .icoimread,imwrite二、使用输入向导(Import Wizard)从菜单File->Import Data打开Import Wizard;或者命令窗口输入函数uiimport。
从剪贴板开始Import Wizard:Edit->Paste to workspace。
matlab c编译

matlab c编译
MATLAB C编译是将MATLAB代码转换为C代码的过程,以便将其集成到其他应用程序或系统中。
以下是MATLAB C编译的一般步骤:
1. 编写MATLAB代码:首先,您需要编写要在C中编译的MATLAB代码。
这可以是任何有效的MATLAB脚本或函数。
2. 使用MATLAB Coder生成C代码:MATLAB Coder是MATLAB的一个附加工具包,它可以将MATLAB代码转换为C和C++代码。
要使用MATLAB Coder,您需要安装它,并确保您的MATLAB版本与您的C代码生成器兼容。
3. 打开MATLAB Coder应用程序:在MATLAB中,打开MATLAB Coder 应用程序。
您可以通过在命令窗口中键入“coder”来打开它。
4. 配置生成选项:在MATLAB Coder中,您需要配置生成选项。
这包括指定要生成的代码类型(C或C++),指定输入和输出文件的路径,以及设
置其他选项。
5. 生成C代码:在配置好生成选项后,您可以生成C代码。
在MATLAB Coder中,选择“Build”选项,然后选择“Build All”以生成C代码。
6. 使用生成的C代码:生成的C代码将保存在您指定的输出文件中。
您可
以在其他应用程序或系统中使用此代码,就像使用任何其他C代码一样。
需要注意的是,不是所有的MATLAB函数都可以转换为C代码。
一些特定的函数和操作可能无法被转换为C代码,或者转换后的效果可能不如在MATLAB中直接执行。
此外,生成的C代码可能需要特定的编译器和工具链才能正确编译和运行。
matlab 函数编译c

MATLAB函数编译C介绍MATLAB是一种广泛使用的高级技术计算语言和环境,主要用于算法开发、数据可视化、数据分析和数值计算等领域。
然而,有时候我们可能需要将MATLAB的函数编译成C语言,以提高代码的执行效率或者将其集成到其他C/C++项目中。
本文将介绍如何使用MATLAB将函数编译成C语言的过程和一些常见的注意事项。
MATLAB函数编译的概述MATLAB提供了一个功能强大的编译器,可以将MATLAB代码转换成可执行的二进制文件,如可执行程序(.exe)或者动态链接库(.dll)。
在函数级别上,我们可以选择将MATLAB函数编译成C语言代码,这样就可以在其他项目中直接调用这些函数,无需依赖MATLAB运行时环境。
编译后的C代码具有较高的性能,并且可以与其他编程语言无缝集成。
编译C的步骤下面是将MATLAB函数编译成C语言的基本步骤:步骤1:选择要编译的函数首先,我们需要选择要编译的MATLAB函数。
通常情况下,建议选择一些计算密集型的函数进行编译,这样可以获得更好的执行性能提升。
步骤2:使用MATLAB的codegen命令MATLAB提供了一个名为codegen的命令,用来将MATLAB函数编译成C语言代码。
以下是使用codegen命令的基本语法:codegen -config cfg functionName在上面的命令中,cfg是一个编译器配置对象,用于指定编译器的选项和参数,functionName是要编译的函数的名称。
步骤3:配置编译器选项在使用codegen命令之前,我们需要配置编译器选项。
可以使用MATLAB的coder.config命令来创建一个编译器配置对象,并使用该对象的属性来配置编译器选项。
例如,可以设置编译目标、优化级别、输出文件名等。
步骤4:调用codegen命令进行编译配置好编译器选项后,我们可以调用codegen命令进行编译。
编译过程可能需要一些时间,具体取决于函数的复杂度和计算量。
matlab中的sfunction的用法(C语言)—转
matlab中的sfunction的用法(C语言)—转matlab中的sfunction的用法(C语言)matlab中的sfunction的用法(C语言)创建一个有1输入(2维),2输出(1维),3个参数,还有全局变量的s-function。
1.新建sfunction的C语言文件打开simulink,点击User-Defined?Functions里面的S-Function?Examples。
这个里面有多个语言版本的模板,有C,C++,Ada,Fortran和M语言的版本,其实都大同小异,只要了解几个函数就很容易使用了。
?选择C语言的版本:从S-function模块中选择C-file?S-functions里面的Basic?C-MEX?template。
打开后,另存为自己的模块名字,如test.c。
?下面我们来分析代码:#define?S_FUNCTION_NAME?test//这里把文件名sfuntmpl_basic修改为test?#define?S_FUNCTION_LEVEL?2#include?"simstruc.h"//程序里面要用到的头文件在这里引用,如“math.h”等。
float?global_var;?//定义全局变量static?void?mdlInitializeSizes(SimStruct?S){//这个函数用来设置输入、输出和参数的。
ssSetNumSFcnParams(S,?3);?/设置参数个数,这里为3?/if?(ssGetNumSFcnParams(S)?!=?ssGetSFcnParamsCount(S))?{return;}ssSetNumContStates(S,?0);//设置连续状态的个数,缺省为0;?ssSetNumDiscStates(S,?0);//设置离散状态的个数,缺省为0;if?(!ssSetNumInputPorts(S,?1))?return;//设置输入变量的个数,这里为1ssSetInputPortWidth(S,?0,?2);?//设置输入变量0的维数为2 ssSetInputPortRequiredContiguous(S,?0,?true);?//设置input0的访问方式,true就是临近访问,这样指针的增量后就可以直接访问下个input端口了。
matlab simulink 转换为c代码
matlab simulink 转换为c代码
MATLAB Simulink是一种广泛使用的图形化建模和仿真工具,可用于设计、模拟和验证动态系统。
当使用Simulink建立模型并完成仿真后,我们可以将Simulink模型转换为C代码,以便在其他平台上进行部署和实际应用。
将Simulink模型转换为C代码,可以通过以下步骤实现:
1. 打开Simulink模型,确保模型已经建立并且可以成功运行。
2. 在Simulink模型中的顶部菜单栏中,选择“Simulation”选项。
3. 从下拉菜单中选择“Configuration Parameters”。
4. 在弹出的对话框中,选择“Code Generation”选项。
5. 在右侧窗格中,可以设置生成C代码的相关选项,如选择生成代码类型、选择生成代码目标等。
6. 调整所需的选项后,点击“OK”以保存设置并关闭对话框。
7. 回到Simulink模型中,点击顶部菜单栏中的“Code”选项。
8. 在下拉菜单中,选择“C/C++ Code”选项。
9. 在弹出的对话框中,选择代码生成的路径和文件名,并点击“Save”以保存设置。
10. 在生成过程完成后,会在指定路径下生成对应的C代码文件和相应的头文件。
这样,我们就成功将Simulink模型转换为C代码。
生成的C代码可以在其他平台上进行编译和部署,用于实际应用中。
注:本文仅讨论了将Simulink模型转换为C代码的简要步骤,实际操作中可能涉及更多细节和特定设置,具体操作可参考Simulink 的文档和教程。
matlab stateflow有限状态机导出c代码
matlab stateflow有限状态机导出c代码
Matlab Stateflow 是一款非常强大的有限状态机仿真环境,拥有着高效、可靠的分析能力,便捷的操作方式。
相信很多人都想知道如何在 Matlab Stateflow 环境下导出 C 代码。
以下为导出 C 代码的具体步骤:
第一步,打开 Matlab Stateflow 环境并新建一个仿真模型;
第二步,在该仿真模型中增加若干个状态,并将它们进行连接,建立起整个状态机的状态图;
第三步,为每个状态添加动作,一般我们都是添加一些常规性质,如信号传输、对流事件的处理等等;
第四步,针对每个状态的“下个状态”进行设定,此时应确保每个状态下一个状态的合理性和可行性;
第五步,添加输入和输出的端口,这些端口变量是状态机与外界进行通信的必需元素。
同样,每个端口都必须设置相关的属性。
第六步,导出 C 代码。
在 Matlab 环境中选中“stateflow”菜单下“Simulink Coder”子菜单中的“生成软件代码”选项。
第七步,在打开的“模板安装程序”窗口内选择“生成函数码”,并在可选代码中增加您自己的代码文件。
第八步,继续在“模板安装程序”的“生成选项”栏目内进行代码生成的相关属性设定,包括代码的存放路径、函数库的名称、代码生成的选项配置等。
第九步,完成代码生成后,我们可以直接查看并编辑生成的 C 代码。
总的来说,Matlab Stateflow 环境下导出 C 代码是一种十分便捷和高效的方法,尤其是对那些需要大量手工编码的开发者而言,简化了编码过程。
当然,你可以根据自己的需求进行合理的修改,使其更加符合你的实际需求。
用Matlab的FDAtool生成IIR滤波器参数以及参数生成C 语言文件
用Matlab的FDAtool生成IIR滤波器参数MATLAB IIR数字滤波器设计首先我们要明白相关的概念。
数字滤波器设计采用角频率,如何与实际信号频率对应?角频率w,采样频率fs ,实际信号频率f的转换关系为:W = 2*pi* f / fs采样频率的角频率为 2 *pi.数字滤波器的指标,以低通为例【见下图】:当我们设计的滤波器是带通的时候。
其通带截止频率有两个,阻带截止频率也有两个。
截止频率还有另外一个称谓,即边沿频率。
FIR 滤波器可以设计为线性相位,并且总是稳定的。
在多数情况下,FIR滤波器的阶数NFIR 显著大于具有等效幅度响应的IIR滤波器阶数NIIR。
NFIR/NIIR 通常为10的量级或更高. IIR 滤波器通常计算更简便。
在很多应用中,并不要求滤波器具有严格的线性相位,在这些情况下,通常会因计算简便而选择IIR滤波器。
例如在很多语音编码当中的滤波器很多都是IIR 滤波器,均衡器一般也用IIR滤波器。
也就是说对实时性要求不是很高的场合可以考虑使用FIR滤波器,当FIR滤波器阶数较长时,可以考虑用FFT去计算。
在设计IIR滤波器时,通常将数字滤波器的设计指标转化成模拟低通原型滤波器的设计指标,从而确定满足这些指标的模拟低通滤波器的传输函数Ha(s),然后再将它变换成所需要的数字滤波器传输函数G(z)。
上述滤波器设计的过程只需要了解其原理。
借助于MATLAB强大的工具,滤波器的设计变得比较简单了。
在MATLAB命令窗口中键入fdatool, 你将启动滤波器设计的图形界面。
你可以从simulink 中直接选择数字滤波器控件而启动。
本文主要讲述IIR数字滤波器设计的方法。
对从麦克风进来的信号滤波。
假定我们要把50hz的电频干扰去掉,同时人说话的频率一般不会超过3400hz。
我们设计一个带通滤波器,通带为【80-3200】,采样率为8k。
根据上面的需求,我们把相关的参数改成下面的界面:单击 Design Filter,数秒之后显示如下:可以看出:滤波器的阶数是36,还有一个 sections: 18. 由于在具体实现时一般是以2阶的级联或并联去实现的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Matlab 转换为VC++程序一、将MATLAB程序或函数打包为可独立运行的exe程序1.首先安装支持MATLAB 生成程序运行的动态链接库,路径:D:\MATLAB704\toolbox\compiler\deploy\win32\MCRInstaller.exe2.写好.m 程序,一般为函数,可以有输入输出参数3.在MATLAB里运行mcc -mv *.m4.运行exe程序即可得到结果。
5.可在命令行中输入参数二、在VC++中调用MATLAB计算引擎1.将MATLAB注册为COM服务器在WINDOWS下运行Matlab/regserver2.将engine.h 所在的目录加入编译器对头文件的搜索路径上,一般是:$MATLAB\extern\include, 把引擎函数库所在的目录加入搜索路径,一般是:3.把需要的函数库文件加入到编译所需的额外库文件参数中,文件名为:libeng.lib; libmx.lib; libmat.lib 等4.定义引擎变量,并且初始化Engine* m_ep=NULL;//fjif(!(m_ep=engOpen("\0"))){AfxMessageBox("Can't start MATLAB Engine!");return NULL;}//hide the command windowengSetVisible(m_ep,0);5.构造输入输出参数mxArray *mxImage=NULL,*mxResult=NULL;mxImage=mxCreateNumericMatrix(m_nImageWidth,m_nImageHeight,mxUINT16_CLASS,mxREAL);memcpy((short*)mxGetPr(mxImage),(short*)m_pImageBuffer,m_nBuffSize);engPutVariable(m_ep,"image",mxImage);6.构造MATLAB命令//engEvalString(m_ep,"figure;");//engEvalString(m_ep,"imshow(image,[]);");//Evaluate the function of timeCString szStrel;szStrel.Format ("strcElement=strel('square',%d);",nSeSize);engEvalString(m_ep,szStrel);engEvalString(m_ep,"result=imopen(image,strcElement);");engEvalString(m_ep,"result=imclose(result,strcElement);");//plot the result//engEvalString(m_ep,"figure;");//engEvalString(m_ep,"imshow(result,[]);");7.接收输出结果mxResult=mxCreateNumericMatrix(m_nImageWidth,m_nImageHeight,mxUINT16_CLASS,mxREAL);mxResult=engGetVariable(m_ep,"result");memcpy((short*)pMorphImage->m_pImageBuffer,(short*)mxGetPr(mxResult),m_nBuffSize);8.销毁MATLAB环境中使用的内存变量//destroy the arraymxDestroyArray(mxImage);mxDestroyArray(mxResult);if(ep!=NULL)engClose(ep);三、在VC++中调用MATLAB生成的动态链接库1.安装VC++编译器在Matlab环境下,输入 mbuild –setup 根据指示配置C++编译器2.在MATLAB环境中编译MATLAB函数mcc –w cpplib: ***.lib -T link: lib ***.m ***.m生成的和必须复制到VC程序当前目录下的文件有:***.h ***.lib ***.dll 和 ***.ctf3.在VC环境调用生成的动态链接库(a)初始化应用程序和库(经实验此段必须放在APP的InitInstance()函数中)if(!mclInitializeApplication(NULL,0)){AfxMessageBox(_T("Could not initialize the application"));return FALSE;}else;//AfxMessageBox(_T("Successfully initialize the application"));if(!LibBraExrInitialize()){AfxMessageBox(_T("Could not initialize the library"));return FALSE;}else;//AfxMessageBox(_T("Successfully initialize the library"));(b)初始化输入输出参数//定义matlab可以识别的矩阵作为输入和输出mwArray mwImage(m_nImageWidth,m_nImageHeight, mxINT16_CLASS, mxREAL);mwImage.SetData (m_pImageBuffer,m_nImageWidth * m_nImageHeight);int nThreshold[1]={0};mwArray mwThreshold(1,1,mxUINT8_CLASS,mxREAL);mwThreshold.SetData (nThreshold,1);(c)调用MATLAB函数并获得输出结果DY_FUN_OTSU(1,mwThreshold,mwImage);mwThreshold.GetData (nThreshold,1);(d)销毁MATLAB使用的环境变量LibBraExrTerminate();mclTerminateApplication();四、在VC++中调用MATLAB生成的COM组件1.安装VC++编译器在Matlab环境下,输入 mbuild –setup 根据指示配置C++编译器2.在MATLAB环境中编译MATLAB函数使用dotnettool:创建新工程;加入M程序;编译工程;打包和发布产生的COM组件产生的DLL文件需要复制到当前程序目录下,如需发布,需要用***.exe程序解压,并执行install.bat3.在VC环境调用生成的动态链接库(a)导入DLL(在stdafx.h文件中)#import "EdgeExtraction_1_0.dll" raw_interfaces_onlyusing namespace EdgeExtraction;(b)初始化和启动COMCoInitialize(NULL); //initialize COM libraryhresult=CLSIDFromProgID(OLESTR("EdgeExtraction.EdgeExtractionclass.1_0"), &clsid); //retrieve CLSID of componentIEdgeExtractionclass *t;hresult=CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,__uuidof(IEdgeExtra ctionclass),(LPVOID *) &t);if(FAILED(hresult)){AfxMessageBox("COM 启动失败!");return NULL;}(c)定义输入输出变量VARIANT input, output; //定义输入输出变量VariantInit(&input);VariantInit(&output);//VariantInit(&output1);input.vt= VT_I2 |VT_ARRAY;//声明输入的类型为VT_ARRAY,Array中的元素为short型output.vt=VT_I2 |VT_ARRAY; //声明输出的类型为VT_ARRAY,Array中的元素为short型//output.vt=VT_R8;//output1.vt=VT_R8;SAFEARRAYBOUND abound[2];abound[0].cElements=m_nImageHeight;//第一维元素的个数abound[0].lLbound=0; //第一维矩阵索引的下界abound[1].cElements=m_nImageWidth;//第二维元素的个数abound[1].lLbound =0;//第二维矩阵索引的下界input.parray=SafeArrayCreate(VT_I2,2,abound);//该函数新建一个SafeArray,并把这个SafeArray的描述符的指针传给x.parray。
input.parray->pvData=pEdgeImage->m_pImageBuffer;output.parray=SafeArrayCreate(VT_I2,2,abound);//该函数新建一个SafeArray,并把这个SafeArray的描述符的指针传给x.parray。
(d)调用MATLAB函数t->fj_FUN_EdgeExtraction (1, &output, input); //call method(e)获得输出结果int HUGEP* pDest;SafeArrayAccessData(output.parray, (void HUGEP**)&pDest);// double totalLeft=output.dblVal ;// double totalRight=output1.dblVal ;memcpy(pEdgeImage->m_pImageBuffer, pDest, pEdgeImage->m_nBuffSize); // Copy into array(f)销毁MATLAB使用的环境变量SafeArrayUnaccessData(output.parray);//SafeArrayDestroy(output.parray); // destroy the array.SafeArrayUnaccessData(input.parray);//SafeArrayDestroy(input.parray); // destroy the array.t->Release();CoUninitialize(); //Unintialize the COM library。