Matlab 版 (精华区)
发信人: seesea (马虎学究), 信区: Matlab
标 题: [合集]总结:m文件转化为c/c++语言文件,VC编译
发信站: 哈工大紫丁香 (2004年04月03日22:41:10 星期六), 站内信件
────────────────────────────────────────
fork (撒哈拉沙漠的沙) 于 Thu Dec 4 00:56:56 2003 说道:
matlab使用很方便,但有时候一些特殊的应用需要我们将matlab中m格式的
文件中的程序翻译成c/c++的形式的程序并在c/c++的编译器中进行编译,本
文总结了一般的方法。
需要分两种情况,第一种是你的m文件中不涉及到有关绘图的函数;第二种
是需要用到绘图函数。下面分别用例子来说明:
第一种情况:
1. 建一个m文件,内容为:
%%%%%%%%%%%%%%%%%%%%%%
function y=fork_1(n)
y=0;
for i=1:n
y=y+i;
end
%%%%%%%%%%%%%%%%%%%%%%
保存后在命令窗口中:
输入:(格式:mcc -t -L Cpp -h 文件名)
mcc -t -L Cpp -h fork_1
然后你会在你的工作目录下找到fork_1.cpp和fork_1.hpp两个文件。
2. 在VC中建一个基于对话框的MFC应用程序,名字为testFork1,添加一个
按钮,并添加按钮响应函数,函数内容在第五步中说明。将上面生成的
两个文件拷贝到VC工程的testFork1目录里。
3. 在VC中选择:工程--->设置,再选属性表Link选项,下拉菜单中选择Input,
在对象/库模块中加入附录A中所列出的内容,注意用空格将它们格开而在忽略
库中加入附录B中列出的内容;再选择属性表C/C++选项,下拉菜单选General,
在预处理程序定义中添加附录C中的内容,原来有的内容要保留,并注意用逗号
将它们隔开。再选择下拉菜单的Precompiled Headers选项,选择“自动使用预
补偿页眉”,在其中添加stdafx.h ,确定。
4. 选择:工具--->选择,属性页选择“目录”,在include files里面加入:
C:\MATLAB6P5\EXTERN\INCLUDE
C:\MATLAB6P5\EXTERN\INCLUDE\CPP
注意,根据你的matlab的安装位置的不同,要相应的修改上面的地址。
在Library files里面加入:
C:\MATLAB6P5\EXTERN\LIB\WIN32
C:\MATLAB6P5\EXTERN\LIB\WIN32\MICROSOFT\MSVC60
注意,根据你的matlab的安装位置的不同,要相应的修改上面的地址。
5. 在按钮响应函数所在文件中添加如下的头文件:
......
#include "matlab.hpp"
#include "fork_1.hpp"
......
函数响应代码为:
int i;
mwArray n;
n=5;
n=fork_1(n);
i=n.ExtractScalar(1);
CString str;
str.Format("%d",i);
AfxMessageBox(str);
6. 编译,连接,执行,一切OK!(注意的是如果你的程序中用到了许多其他函数,
matlab会为每个函数生成一个对应的hpp和cpp文件,必须将他们都拷贝你的工
程中去)
第二种情况:
1. 建一个m文件:
%%%%%%%%%%%%%%%%%%%%%
function fork_2()
x=[1 2 3];
y=[1 3 1];
plot(x,y);
%%%%%%%%%%%%%%%%%%%%%
保存后在命令窗口中:
输入:(格式:mcc -B sglcpp 文件名)
mcc -B sglcpp fork_2
2.
3.
4.
下上各步与前例相似,只是这是会多出来个fork_2_mainhg.cpp,fork_2.exe和
bin文件夹。在拷贝的时候文件fork_2_mainhg.cpp和fork_2.exe不要。但需要将
bin文件夹考到VC的工程目录中去。
5. 在按钮响应函数所在文件中添加如下的头文件:
......
#include "matlab.hpp"
#include "fork_2.hpp"
......
函数响应代码为:
libmmfileInitialize();
libmwsglmInitialize();
mlfHGInitialize(NULL,NULL);
fork_2();
mlfHGWaitForFiguresToDie();
mlfHGTerminate();
libmmfileTerminate();
libmwsglmTerminate();
6. 编译,连接,执行,一切OK!(注意的是如果你的程序中用到了许多其他函数,
matlab会为每个函数生成一个对应的hpp和cpp文件,必须将他们都拷贝你的工
程中去。另外fork_2()之前的三行代码和之后的四行代码必不可少,但应该保
证在你的程序的整个执行过程中他们分别只被调用一次,所以最好将分别他们
放置在程序的初始化函数与程序结束时才调用的做扫尾工作的函数里面)
附录A:链接库
libmmfile.lib libmatlb.lib libmx.lib libmat.lib libmatpm.lib
sgl.lib libmwsglm.lib libmwservices.lib
附录B:忽略库
msvcrt.lib
附录C: 预处理程序定义
MSVC,IBMPC,MSWIND
附录D:进一步参考
关于mcc命令的使用参见matlab帮助文件
关于mwArray的数据读出方式参见matlab在线帮助:
http://www.mathworks.com/access/helpdesk_r12p1/help/
toolbox/mathlib/cppmathug/cppmathug.shtml
“m文件转化为c/c++语言文件”很简单,但要在VC中通过编译连接却会碰到很多问题,
即使通过了编译与连接也不保证能正确执行,有时候会遇到很多棘手的麻烦,在我
的另一篇文章(站内有):“分析:解决m程序转化成cpp程序的编译问题”中就举了
一个这样的例子。在那篇文章里虽然最后靠了几招“歪门邪道”搞定了那个问题,但
还是可以看出这样的转化问题是很麻烦的。
────────────────────────────────────────
adapt (随遇而安) 于 2003年12月04日14:52:30 星期四 说道:
不知道有没有人把surf之类的函数转换成功过?保留视图的旋转之类的功能
shading interp的效果能不能搞出来?
【 在 fork (撒哈拉沙漠的沙) 的大作中提到: 】
:
: matlab使用很方便,但有时候一些特殊的应用需要我们将matlab中m格式的
: 文件中的程序翻译成c/c++的形式的程序并在c/c++的编译器中进行编译,本
: 文总结了一般的方法。
: 需要分两种情况,第一种是你的m文件中不涉及到有关绘图的函数;第二种
: 是需要用到绘图函数。下面分别用例子来说明:
:
: 第一种情况:
: 1. 建一个m文件,内容为:
: %%%%%%%%%%%%%%%%%%%%%%
: function y=fork_1(n)
────────────────────────────────────────
fork (撒哈拉沙漠的沙) 于 Thu Dec 4 22:46:49 2003 说道:
刚才把下面这个程序也转化成功了,hehe!
%%%%%%%%%%%%%%%%%%%%%%%%
function fork_4()
sphere(16)
axis square
shading interp
title('Interpolated Shading')
%%%%%%%%%%%%%%%%%%%%%%%%
【 在 adapt 的大作中提到: 】
: 不知道有没有人把surf之类的函数转换成功过?保留视图的旋转之类的功能
: shading interp的效果能不能搞出来?
: 【 在 fork (撒哈拉沙漠的沙) 的大作中提到: 】
: :
: : matlab使用很方便,但有时候一些特殊的应用需要我们将matlab中m格式的
: : 文件中的程序翻译成c/c++的形式的程序并在c/c++的编译器中进行编译,本
: : 文总结了一般的方法。
: : 需要分两种情况,第一种是你的m文件中不涉及到有关绘图的函数;第二种
: : 是需要用到绘图函数。下面分别用例子来说明:
: :
: : 第一种情况:
: : 1. 建一个m文件,内容为:
: : %%%%%%%%%%%%%%%%%%%%%%
: : function y=fork_1(n)
────────────────────────────────────────
fork (撒哈拉沙漠的沙) 于 Thu Dec 4 22:48:54 2003 说道:
adapt我将下面这个程序转化成功了,不知道是不是你说的这种情况?
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function fork_3()
k = 5;
n = 2^k-1;
[x,y,z] = sphere(n);
c = hadamard(2^k);
surf(x,y,z,c);
colormap([1 1 0; 0 1 1])
axis equal
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
────────────────────────────────────────
Ustcer (山城棒棒儿军) 于 2003年12月04日22:56:16 星期四 说道:
请问你在转换过程中发现pause是不是失效了?
不再需要按动按钮,它自停一秒左右,然后又继续了?
【 在 fork (撒哈拉沙漠的沙) 的大作中提到: 】
: adapt我将下面这个程序转化成功了,不知道是不是你说的这种情况?
: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
: function fork_3()
: k = 5;
: n = 2^k-1;
: [x,y,z] = sphere(n);
: c = hadamard(2^k);
: surf(x,y,z,c);
: colormap([1 1 0; 0 1 1])
: axis equal
: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
────────────────────────────────────────
Ustcer (山城棒棒儿军) 于 Fri Dec 5 14:06:15 2003 说道:
你的意思是:内建函数都不可以编译为stand-alone c程序么?
【 在 fork 的大作中提到: 】
: 看一看,除了注视什么也没有。因此在stand-along C程序中调用
: 不会成功。
: ※ 修改:.fork 於 Dec 5 00:19:42 2003 修改本文.[FROM: 219.217.225.36]
────────────────────────────────────────
fork (撒哈拉沙漠的沙) 于 Fri Dec 5 19:10:14 2003 说道:
对不起,我想我犯了一个错误,谢谢Ustcer的提醒,因为我转化过的
程序中有很多都用到了“Built-in function”,它们都是可以的,
我试验了不带参数的pause调用的确是延时一秒,查看转化后的cpp文件
可以看到对于这个函数:
%%%%%%%%%%%%%%%%%%%%
function fork_5()
pause;
x=[1 2 3];
y=[1 3 1];
plot(x,y);
%%%%%%%%%%%%%%%%%%%%
它是这样实现的:
////////////////////////////////
mwLocalFunctionTable save_local_function_table_
= &_local_function_table_fork_5;
mwArray y = mwArray::DIN;
mwArray x = mwArray::DIN;
mwArray ans = mwArray::UNDEFINED;
//
// pause;
//
pause(mwArray::DIN);
//
// x=[1 2 3];
//
x = _mxarray0_;
//
// y=[1 3 1];
//
y = _mxarray2_;
//
// plot(x,y);
//
ans.EqAns(Nplot(0, mwVarargin(mwVv(x, "x"), mwVv(y, "y"))));
////////////////////////////////
看来它自动的给pause传递了一个值mwArray::DIN,但你若在c中直接观察它,如:
n=mwArray::DIN;
i=n.ExtractScalar(1);
会得到一个运行时错误,matlab的文档中说它是Default input,我想这个input
是指从matlab窗口的命令行接收的input而非stand-along程序的键盘输入,所以
如想完成同样的功能最好想个其他方法。
────────────────────────────────────────
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:5.632毫秒