分享
 
 
 

分析:解决m程序转化成cpp程序的编译问题

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

发信人: fork (撒哈拉沙漠的沙), 信区: Matlab

标 题: 分析:解决m程序转化成cpp程序的编译问题【小波工工?

发信站: 哈工大紫丁香 (Sat Nov 29 21:32:06 2003), 站内信件

背景:有一个朋友想用小波变换对图像处理,利用现成的matlab的小波工具箱中的

程序。但是他导师要求将所有的matlab程序转化成c语言程序并在VC环境下编译。

其实,用matlab的程序转化为cpp文件并独立编译存在着很大的局限性。首先对于

很多已编译好的mex程序,虽然能够编译通过但通常会得到这个警告:

“the "XXX" function is only available in MEX mode. A run-time error

will occur if this code is executed in stand-alone mode.”这会引起一个

运行时错误,仔细检查会发现这样的mex文件是以dll形式存在,对应的m文件

只是一个幌子而已,m文件的存在仅仅是为了提供使用说明而已;即使你用到的

所有函数都是以m文件存在,有时候还是有问题,请看下面的程序:

%%%%%%%%%%%%%

function simon()

[X,map]=imread('simon.bmp');

x=X;

colormap(map);

x=double(x);

h=wavedecnd(x,2,'haar')

image(h{1});

%%%%%%%%%%%%%

该程序对simon.bmp做'haar'小波变换并显示第一块。

编译它:mcc -B sglCpp simon

运行编译后自动生成的simon.exe,发生错误:

“Exception! File: handler.cpp, Line: 73

Variables are not supported by EVAL in compiled code.”

这段话表示函数"eval"不支持cpp编译,但是我们并没有显式的调用过这个函数

啊,那么肯定是在我们调用的其他函数中间接的调用了这个函数。于是打开

wavedecnd函数一个一个的检查所有它直接或间接调用过的函数,最后在

wavemngr.m中找到了对eval的三次调用:

“eval(['load ' bin_file ' -mat'],'err = 1;');”

如何来解决这个问题呢?mathworks给出了答案,参见:

http://www.mathworks.com/support/tech-notes/1100/1103.shtml

我选择了用“try catch”结构替换eval的间接调用:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% eval(['load ' bin_file ' -mat'],'err = 1;');

try

load(bin_file,' -mat');

catch

err=1;

end

if err

err = 0;

% eval(['load ' bin_ini_file ' -mat'],'err = 1;');

try

load(bin_ini_file,' -mat');

catch

err=1;

end

.......................................

% eval(['save ' bin_file ' Wavelets_Info'],'err = 1;');

try

save(bin_file,' Wavelets_Info');

catch

err=1;

end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

完成后,再一次编译:mcc -B sglCpp simon

运行程序,又出错:

“Exception! File: handler.cpp, Line: 73

Reference to unknown function 'dbwavf' from FEVAL in stand-alone mode.”

意思是在feval中调用了未知函数“dbwavf”,于是找到在wfilters.m中有这样

一处调用:

“F = feval(fname,wname);”

而fname来自于该文件中的一句:

“[wtype,fname] = wavemngr('fields',wname,'type','file');”

追查!打开wavemngr.m看到了这样的语句:

“files = ...

{...

'dbwavf';

'dbwavf';

'symwavf';

'coifwavf';

'biorwavf';

'rbiowavf';

'meyer';

'dmey.mat';

'gauswavf';

'mexihat';

'morlet'

'cgauwavf';

'shanwavf';

'fbspwavf';

'cmorwavf'

};

于是解决的方法也就出来了,分析出错的原因在于文件中用feval间接的调用

了函数“dbwavf”,feval只是将它作字符串而不是文件名处理而之前的代码

中又没有显式的声明过该函数,因而编译器也就不知道还需要在生成的cpp代

码中加上对该函数的声明了,也不会额外的将dbwavf.m转化成cpp文件,解决

的办法有两个:

1,直接用“F = dbwavf(wname)”来替代“F = feval(fname,wname);”

再编译,运行,没问题了:)

2,读者一定发现第一个办法中问题了,如果是调用的symwavf,或者morlet

或者任何别的函数呢?那么这个方法就降低原程序的灵活性,解决的方法

(呵呵,想到这个方法实在需要些灵感!)就是在wfilters.m中该调用

“F = feval(fname,wname);”之前对所有有可能要调用到的函数做一次

伪声明(之所以叫伪声明是因为matlab中似乎没有声明一说,而这么做的

实质等同于c语言中的声明),即在“F = feval(fname,wname);”之前

加上一句:“dbwavf('haar');”

现在成了:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

dbwavf('haar');

if wtype==1 % orth. wavelet

if ~isempty(mat_f)

F = eval(wname);

else

F = feval(fname,wname);

%F=dbwavf(wname);

end

..................................

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

注意,我只加了一句:“dbwavf('haar');”,因为我知道它只会调用

这一个函数,如果它要调用多个函数,只要依样画葫芦就行了。

编译,运行,ok了:)

剩下的事情就是将生成的cpp文件和hpp文件加入到VC中的工程里,修改相应

的编译和连接参数,编译出一个独立的exe程序了。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有