zuohaoyi 发表于 2010-5-1 21:28

关于matlab自带遗传算法工具箱的一个难题

function z=my_cond(num);

r_num=50;
%
% for r=1:50
%
%   dcm='E:\散射0.2-6um\';
%   rds=num2str(r/10);
%
%   opn_name=;
%
%   fid(1)= fopen(opn_name,'rt');
%   for w=1:5800
%         Q_orgin(w,r)=fscanf(fid(1),'%e',1);
%   end
%   fclose(fid(1));
% end

wave_num=50;

for r=1:50
    for s=1:wave_num
      Q_try(s,r)=Q_orgin(ceil(num(s)),r);
    end
end
z=cond(Q_try);


上面这段代码是m文件里的代码(目标函数),当用matlab自带遗传算法工具箱优化的时候,%号后面的部分,遗传算法每次循环都会调用,这样会极大增加计算时间。实际上只需要调用一次就可以了,有什么办法只让这部分在第一次循环的时候才调用,以后就不调用了?

[ 本帖最后由 ChaChing 于 2010-5-2 11:17 编辑 ]

ChaChing 发表于 2010-5-2 11:14

回复 楼主 zuohaoyi 的帖子

个人水平专业有限, 遗传工具箱也没玩过, 又看不清LZ的问题!
同待高人路过

yufeng 发表于 2010-5-2 21:58

可以设置一个标志 然后计算完以后 修改这个标志 这样就只运行一次了

zuohaoyi 发表于 2010-5-2 23:46

原帖由 yufeng 于 2010-5-2 21:58 发表 http://www.chinavib.com/forum/images/common/back.gif
可以设置一个标志 然后计算完以后 修改这个标志 这样就只运行一次了
茅塞顿开,感激不尽。

晕啊,另外一个问题又出现了,当进入第二次循环后,%后面的部分没再运行,但却又提示Q_orgin这一变量没有定义,从而终止运行。似乎是matlab自带遗传算法在每次循环之后都会清理上一次循环所定义的变量,下一次循环的时候需要重新定义这些变量。这就使得%后的内容非运行不可。
      我觉得现在唯一的办法就是不让遗传算法清理变量,让上一个循环定义的变量在下一个循环也能用,这需要修改matlab自带的相关m文件,但却不知道应如何修改。

[ 本帖最后由 ChaChing 于 2010-5-3 00:10 编辑 ]

ChaChing 发表于 2010-5-3 00:15

好像有点知道LZ要的!? 猜的
help global

zuohaoyi 发表于 2010-5-3 16:33

搞定了。用了global。先是在命令窗口里输入global Q_orgin。然后新开了一个m文件,输入%号后的代码,将硬盘上数据读入Q_orgin数组。最后在遗传算法文件里面删除掉%好后面的部分,然后再正式使用Q_orgin数组之前再次声明global Q_orgin。这样运行的时候遗传算法就不用再去读硬盘了,而是直接调用内存里的Q_orgin数组。这样速度快了n倍。

ChaChing 发表于 2010-5-3 21:24

LZ也没谢下!? 也罢, 问题解决最要紧! :loveliness:
再度提醒每个人水平专业不同, 若要别人帮忙, 需想办法说明清楚!? 不是让人猜测, 真的看下这连接, LZ程度应也不低, 应能理解!
提问的智慧!!!!(发帖前请认真阅读)
http://forum.vibunion.com/forum/viewthread.php?tid=21991

zuohaoyi 发表于 2010-5-3 22:43

中国人都比较含蓄嘛,不一定要明说,其实感激之情已经溢于言表了。:lol :lol :lol :lol :lol :lol :lol
页: [1]
查看完整版本: 关于matlab自带遗传算法工具箱的一个难题