如果C语言函数参数太多,可以怎么优化

如果C语言函数参数太多,可以怎么优化,第1张

一个函数参数的数目没有明确的限制,但是参数过多(例如超过8个)显然是一种不可取的编程风格。参数的数目直接影响调用函数的速度,参数越多,调用函数就越慢。另一方面,参数的数目少,程序就显得精练、简洁,这有助于检查和发现程序中的错误。因此,通常应该尽可能减少参数的数目,如果一个函数的槐灶察参数超过4个,你就应该考虑一下函数是否编写得当。 如果一个函数不得不使用很多参数,你可以定义一个结构来容纳这些参数,这是一种非常好的解决方法。在下例中,函数print_report()需要使用10个参数,然而在它的说明中并没有列出铅茄这些参数,而是通过一个RPT_PARMS结构辩芦得到这些参数。 # include <atdio. h>typedef struct ( int orientation char rpt_name[25]char rpt_path[40]int destinationchar output_file[25]int starting_pageint ending_pagechar db_name[25]char db_path[40]int draft_quality)RPT_PARMSvoid main (void)int print_report (RPT_PARMS* )void main (void) { RPT_PARMS rpt_parm/*define the report parameter structure variable * / /* set up the report parameter structure variable to pass to the print_report 0 function */ rpt_parm. orientation = ORIENT_LANDSCAPErpt_parm.rpt_name = "QSALES.RPT"rpt_parm. rpt_path = "Ci\REPORTS" rpt_parm. destination == DEST_FILErpt_parm. output_file = "QSALES. TXT" rpt_parm. starting_page = 1rpt_pann. ending_page = RPT_ENDrpt_pann.db_name = "SALES. DB"rpt_parm.db_path = "Ci\DATA"rpt_pann. draft_quality = TRUE/*call the print_report 0 functionpaaaing it a pointer to the parameteM inatead of paMing it a long liat of 10 aeparate parameteM. * / ret_code = print_report(cu*pt_parm)} int print_report(RPT_PARMS*p) { int rc/*acccM the report parametcra paaaed to the print_report() function */ oricnt_printcr(p->orientation)Kt_printer_quality((p->draft_quality == TRUE) ? DRAFT NORMAL)return rc} 上例唯一的不足是编译程序无法检查引用print_report()函数时RPT_PARMS结构的10个成员是否符合要求。

程序中问题:1.主晌让团程序提供的msg0,子程序却用msg,子程序不接受,应统一

2.msg0所示值不在VLB和VUB之间,滑桥按下面改:

function f=cpro(msg)

x=zeros(7,1000)

y=zeros(1,1000)

c(1)=25

c(5)=50

c(7)=50

for i=3

if abs(msg(i+7)*3-msg(i))/msg(i)<=0.01

c(i)=200

elseif abs(msg(i+7)*3-msg(i))/msg(i)>0.01&&abs(msg(i+7)*3-msg(i))/msg(i)<=0.05

c(i)=50

else

c(i)=20

end

end

for i=4

if abs(msg(i+7)*3-msg(i))/msg(i)<=0.01

c(i)=500

elseif abs(msg(i+7)*3-msg(i))/msg(i)>0.01&&abs(msg(i+7)*3-msg(i))/msg(i)<=0.05

c(i)=100

else

c(i)=50

end

end

for i=6

if abs(msg(i+7)*3-msg(i))/msg(i)<=0.01

c(i)=100

elseif abs(msg(i+7)*3-msg(i))/msg(i)>0.01&&abs(msg(i+7)*3-msg(i))/msg(i)<=0.05

c(i)=25

else

c(i)=10

end

end

for i=1:7

for j=1:1000

x(i,j)=normrnd(msg(i),msg(i+7))

end

end

for j=1:1000

y(j)=174.42*(x(1,j)/x(5,j))*(x(3,j)/(x(2,j)-x(1,j)))^0.85*sqrt((1-2.62*(1-0.36*(x(4,j)/x(2,j))^-0.56)^1.5*(x(4,j)/x(2,j))^1.16)/(x(6,j)*x(7,j)))

end

for j=1:1000

if abs(y(j)-1.5)<=0.1

w(j)=0

elseif abs(y(j)-1.5)<=0.3&&abs(y(j)-1.5)>=0.1

w(j)=1000

else

w(j)=9000

end

end

f=sum(w)/1000+sum(c)

%{

主程序

msg=[0.1 0.25 0.1 0.1 1.5 16 0.7 0.5 0.5 0.5 0.5 0.5 0.5 0.5]

VLB=[0.075 0.225 0.075 0.075 1.125 12 0.5625 0 0 0 0 0 0 0]

VUB=[0.125 0.375 0.125 0.125 1.875 20 0.935 0.7 0.7 0.7 0.9 0.9 0.9 0.9]

[msg0,fval]=fmincon('cpro',msg,[],[],[],[],VLB,VUB)

%}

保存后在命令行输入主程宴橘序,结果:

Warning: Trust-region-reflective method does not currently solve this type of problem,

using active-set (line search) instead.

>In fmincon at 422

Maximum number of function evaluations exceeded

increase OPTIONS.MaxFunEvals.

msg0 =

0.07500.36560.07810.07501.1720 12.00200.56260.01610.00020.00020.02360.69860.0002 0

fval =

6890

这个不是10个小图合成一个大图,是把10个图以不同的权重叠加在一起,这个权重就是要求的x。也就是x向量有10个标量对应10个图。

然后,优化函数中,我把图形以 60*60大小进行划分, 也就是说整张图分成N个 60*60的 block。 优化的目标就是,图像中的游猜某些block内的像素进行羡念计算,求出该block块儿的梯度。优化目标是让该梯度 = 0.24 。 所以,会神派型有多个block 的梯度 都有要求, 相当于多个优化目标。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12218188.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存