Matcom和Borland C++ Builder混合编程及Matcom使用技巧总结

2006-10-12 16:24:54

Matcom和Borland C++ Builder混合编程及Matcom使用技巧总结

【一】安装篇

其实网上有很多关于如何安装和配置Matcom与Borland C++ Builder(简称BCB)或者VC的教程,因我用BCB较多,故这里以Matcom 4.5 和 BCB 6.0为例简单说明一下。

1. 注意Matcom有for VC 和for BCB之分,请下载正确的版本;
2. 安装BCB 6.0;
3. 安装Matcom 4.5;

注:Matcom安装完毕后要进行配置,如果你使用6.x版本以上的matlab就要留意了,配置过程中在搜索matlab路径时说写不到matcom.m原因是matlab 6.x的Windows版本matlab.exe不在matlab/bin下,而在matlab/bin/win32,所以,此时只要把bin/win32/matlab.exe移动(切记是剪切不是复制)到bin/matlab.exe,即上移一层目录,这样就可以完成对matlab的关联,配置成功之后再移动回去就可以了。当然了,为了省事(不清楚会否带来什么问题),可以选择没有安装matlab从而跳过这个配置,呵呵。


【二】配置篇

1. 把Matcom/lib 目录下的两个文件拷贝到Builder目录:v4500b.lib复制到Builder/Lib目录,matlib.h复制到Builder/Include目录;

2. 启动Builder,把文件v4500b.lib添加到当前工程中(Add to project),且在主文件(.cpp)的第一行添加语句 #include "matlib.h";

3. 在主文件(.cpp)中添加语句USELIB("v4500b.lib");


【三】程序编写、编译与运行篇

本节内容都是出自我的经验所得,如果有不对的地方,请大牛们指正。

一. 在Matcom中:

强烈建议每次编译前先把编译路径(就是你要编译的m文件的存放路径)中的所有东西(指上一次编译过的文件,当然不包括m文件,呵呵)删除掉,然后再编译,否则matcom会因为保留了上一次的编译结果而忽略应有的检查!

1. Matcom支持函数的嵌套调用,但需要把所调用的全部m文件放在与主文件(你要编译的文件)同一目录下(但因为下面的第4-6点,我不得不把调用的m文件拷贝到我的程序目录下后作手动修改),即,如果编译后在matcom命令窗口中出现“>函数名< was not found”的错误,那么需要在matlab目录下把相应的m文件复制到你的编译路径下,再重新编译试试(一个简单的查找方法:在matlab命令窗口中输入“edit 函数名”,能够打开的话,就可以在窗口标题中找到其路径了,当然,也可以输入“which 函数名”,不过打开文件的好处是可以查看该m文件有否调用另外的函数)

2. 主文件中的主函数(与文件名同名的函数)只能有一个输入,如果有多个输入,必须写成脚本script形式,且script文件只需包含一个语句。如:
A.m文件(script文件):B(1,2);
B.m文件(m文件):function output = B(i,j) ……

且在matcom中只需对A.m文件进行编译,而在C++ builder中需要在主文件(.cpp或.h)添加语句#include “B.cpp”,另外,要把用到的所有cpp文件(除了脚本那个,即除了A.cpp和g_A.cpp,后者matcom编译后自动生成)添加到当前工程中。

另外要注意的地方:BCB中只能编译成exe文件,VC中可以编译成dll文件,编译完毕后记得留意MIDEVA主界面右下角的窗口,检查编译过程中是否出现error的提示,因为就算出现error的提示,matcom都会照样生成exe或dll文件,如果没有注意error提示而继续使用这些生成文件的话,在BCB或VC中调用时就不能得到正确的结果,而在BCB中调试生成的c文件远比matlab麻烦,不易发现错误,因此需要特别留意

3. 在m文件中,不能包含.dll的函数,因在matcom中不能编译.dll文件(只测试过BCB的)。

4. 只能写load(filename),不能写load(filename,’-mat’);

5. 不能利用feval和eval进行隐式函数调用,因此只能显式给出具体的函数名:即不能写feval(‘symwavf’,’sym6’),只能写symwavf(‘sym6’),其中symwavf是函数名;

6. 在m文件中使用全局变量的问题:可以在matcom中多个m文件使用全局变量,具体做法与在matlab中相同。例:
在A.m中,function A(a,b)
global BB
BB = b;
...
在B.m中,function B
global BB
...
7. matcom支持x(end),但不支持x(max(end,10)),要把后者中的end换成显式的x(max(length(x),10));

8. 当然了,由于matcom最高版本是4.5,因此不支持matlab7.0版之后引入的逻辑运算符&&和||,尽管它们在matlab中可以加快条件判断的速度;

9. [转happy教授]M文件不能涉及MATLAB的内部类(如strncmp函数中的xlate,它属于built-in (undocumented) functions)

二. 在C++ Builder 中:

1. Matcom 4.5不支持struct(尽管编译可以通过),因我在Builder跟踪调试发现,无论在函数调用(.m文件中)还是函数返回(cpp文件中)中,传递的数据都不是我所需要的;

2. 在Builder程序中调用matlab的函数后,如果要访问这些变量(数据),则要用:.r(i,j)或者.r(i),且下标从1开始,而在跟踪调试时,则要用:.pr[j],且下标从0开始,如果是二维数组,那么pr的下标是仍然是采用一维的形式,排列的顺序跟sub2ind函数一样。注意这时看到的结果都是数字,无论该变量存放的是double型还是string型数据!因此Matcom的较佳使用场合:以double(int)型数组(或向量、单变量)作为结果输出时;

3. 由于调用了matlab的函数,因此程序运行后不能正常退出(即在任务管理器中该进程还存在),暂用下面强行的方法使程序正常退出:

首先在主文件开始添加:

#define isBadHandle(h) ( (h) == NULL || (h) == INVALID_HANDLE_VALUE )

然后在类的析构函数中添加以下语句:

HANDLE hProcess;
hProcess = OpenProcess( PROCESS_TERMINATE, true, GetCurrentProcessId() );
if ( isBadHandle( hProcess ) )
ShowMessage( "OpenProcess() failed, err = %lu/n");
else {
// kill process
TerminateProcess( hProcess, (DWORD) -1 );
}
// close handle
CloseHandle( hProcess );

4. Matcom不支持列向量赋值给行向量(反之亦然),尽管在matlab中是可行的,在matcom中也可以编译通过,但是在Builder中使用时会出错。


【四】发布篇

在VC/BCB中调用了matcom库,通过编译生成独立执行的程序,即得到release版本的exe文件,但不能直接拷贝到没有安装matlab和BCB的电脑上使用,还需要把ago4500.dll和v4500b.dll两个库文件同时拷贝走并放置在与.exe文件同一目录下才行。这些dll文件可以在/windows/system或者windows/system32目录下找到,其中ago4500.dll要在安装了matcom后才有。至于opengl32.dll,glu32.dll这两个库文件,估计在程序中使用了画图函数才需要,我没有试过,不是太清楚。

附注:在BCB中生成Release版本程序的方法:
1 project-- 2 project-- 3 project--
4 重新build,并运行,就ok了。

【五】其他问题可以参考:数学工具FAQ(数学工具常见问题集)――这个百度搜索一下就找到了。

----------------------------------------------------------------------------------------------------------------------------------------------
后话:大概在一年多前,我使用过matcom,其目的是对能完成某一运算(或某一操作,例如求取字符轮廓的曲率特征)的m文件进行编译,制作出exe文件,然后在C++Builder中直接调用它,我不知道这种方法(利用matcom转换matlab代码在BCB中调用)比其他方法有何优势(速度上和效率上),只是为了完成工作任务(任务规定使用BCB为主开发平台)而采取了这种方法,请大牛们给点建议或者意见,共同进步。另外,听说现在MathTools公司已经被生产Matlab的MathWorks公司兼并,Matcom的最后版本为4.5,之后部分matcom的内容被合并到mathworks的visual matlab中。这在matlab6.5乃至最新的7.2版有体现吗?请高手指点。

你可能感兴趣的:(borland,c++,编程,matlab,c++builder,exe)