realhappy 发表于 2006-10-18 15:27

急!复杂函数调用是怎么传递参数

= galssvm(bounds,evalFN)调用子函数evalFN,需要在调用galssvm时,把参数(sol,model,Xtra, Ytra, Xval, Yval,estfct, trainfct, simfct)传递给evalFN,请问怎么传递啊!
谢谢了!

eight 发表于 2006-10-18 16:20

原帖由 realhappy 于 2006-10-18 15:27 发表
= galssvm(bounds,evalFN)调用子函数evalFN,需要在调用galssvm时,把参数(sol,model,Xtra, Ytra, Xval, Yval,estfct, trainfct, simfct)传递给evalFN,请问怎么传递啊!
谢谢了!


= galssvm(bounds,evalFN,sol,model,Xtra, Ytra, Xval, Yval,estfct, trainfct, simfct) 行不行啊?

realhappy 发表于 2006-10-18 20:11

不行啊,参数(sol,model,Xtra, Ytra, Xval, Yval,estfct, trainfct, simfct)只是ecalOps而已,因为galssvm调用了很多函数,如下:
function = galssvm(bounds,evalFN,evalOps,startPop,opts,...
termFN,termOps,selectFN,selectOps,xOverFNs,xOverOps,mutFNs,mutOps)

realhappy 发表于 2006-10-18 20:15

原帖由 realhappy 于 2006-10-18 20:11 发表
不行啊,参数(sol,model,Xtra, Ytra, Xval, Yval,estfct, trainfct, simfct)只是ecalOps而已,因为galssvm调用了很多函数,如下:
function= galssvm(bounds,evalFN,evalOps,startPop,opts,...
termFN,termOp ...
函数功能是用遗传算法来优化支持向量机参数,sol是某代的染色体,ecalFN是适应度函数,evalOps是适应度函数里面需要调用的参数,包括参数(sol,model,Xtra, Ytra, Xval, Yval,estfct, trainfct, simfct),不知道这么多参数,怎么作为一个结果体传进去。

eight 发表于 2006-10-18 20:35

原帖由 realhappy 于 2006-10-18 20:15 发表

函数功能是用遗传算法来优化支持向量机参数,sol是某代的染色体,ecalFN是适应度函数,evalOps是适应度函数里面需要调用的参数,包括参数(sol,model,Xtra, Ytra, Xval, Yval,estfct, trainfct, simfct),不知道 ...


刚自己写了一个小程序,看看能否对你有所启发:

function y = myComplexFunc%主函数
f = @(a,b,c) (a+b+c);
a = 1;
b = 2;
c = 3;
x = -2;
y = myTimes(x,f,{a,b,c});

function y = myTimes(x,f,varargins)
a = varargins{1};
b = varargins{2};
c = varargins{3};
z = f(a,b,c);
y = x*z;

realhappy 发表于 2006-10-18 21:32

原帖由 eight 于 2006-10-18 20:35 发表



刚自己写了一个小程序,看看能否对你有所启发:

function y = myComplexFunc%主函数
f = @(a,b,c) (a+b+c);
a = 1;
b = 2;
c = 3;
x = -2;
y = myTimes(x,f,{a,b,c});

function y = myTimes ...
首先非常eight的热心帮忙,这程序有几点不懂:
第一:f = @(a,b,c) (a+b+c);是预先定义子函数吗?
第二:function y = myTimes(x,f,varargins)中的varargins是不是指后面所有的参数,因为在我那个程序里后面还有其他参数。varargins是指输入参数的个数吗?
其实我最想知道的是,不同的数据类型,(比如(sol,model,Xtra, Ytra, Xval, Yval)中,sol为二维数组,model为一个结构体),能够在构建成一个更复杂的结果体传到子程序。

realhappy 发表于 2006-10-18 21:33

很怀量labview中的族,多复杂的数据类型都能构建成更复杂的族,呵呵!

eight 发表于 2006-10-18 22:26

原帖由 realhappy 于 2006-10-18 21:32 发表

首先非常eight的热心帮忙,这程序有几点不懂:
第一:f = @(a,b,c) (a+b+c);是预先定义子函数吗?
第二:function y = myTimes(x,f,varargins)中的varargins是不是指后面所有的参数,因为在我那个程序里后面还 ...


1. f = @(a,b,c)(a+b+c) 是定义一个函数,a,b,c是参数,函数体是a+b+c,返回的是函数的句柄

2.可以这样:

function y = myComplexFunc
f = @(a,b,c) (a+b+c);
a = 1;
b = 2;
c = 3;
x1 = -2;
g = @(m,n)(m*n);
m = -1;
n = 4;
x2 = 3;
y = myTimes(x1,x2,f,{a,b,c},g,{m,n});


function y = myTimes(u,v,f,varargins1,g,varargins2)
x1 = varargins1{1};
y1 = varargins1{2};
z1 = varargins1{3};
t1 = f(x1,y1,z1);
y = u*t1;
x2 = varargins2{1};
y2 = varargins2{2};
t2 = g(x2,y2);
y2 = v*t2;
y = y - y2;

eight 发表于 2006-10-18 22:35

原帖由 realhappy 于 2006-10-18 21:32 发表

首先非常eight的热心帮忙,这程序有几点不懂:
第一:f = @(a,b,c) (a+b+c);是预先定义子函数吗?
第二:function y = myTimes(x,f,varargins)中的varargins是不是指后面所有的参数,因为在我那个程序里后面还 ...


在你的例子中,我想应该这样:
假设evalFN是函数名,startPop,opts,termFN,termOps,selectFN,selectOps,xOverFNs,xOverOps,mutFNs,mutOps是它的形式参数,evalOps也是函数名,sol,model,Xtra, Ytra, Xval, Yval,estfct, trainfct, simfct是它的形式参数,则在galssvm中这样写:
function = galssvm(bounds,evalFN,varargins1,evalOps,varargins2)
startPop = varargins1{1};
opts = varargins1{2};
....
evalFN(startPop,opts,...);
sol= varargins2{1};
model= varargins2{2};
....
evalOps(sol,model,...);


调用的时候,用galssvm(bounds,evalFN,{startPop,opts,...},evalOps,{sol,model,...}),至于参数的类型,应该没有限制。我暂时只想到这样的笨方法,不知道是否有更好的处理方法,呵呵,希望能帮到你吧。

[ 本帖最后由 eight 于 2006-10-18 22:36 编辑 ]

realhappy 发表于 2006-10-18 22:42

好像我试过,是不行的,办公室要锁门了,明天再试,非常非常感谢eight!!

shaqiang2006 发表于 2007-3-21 20:07

问题解决了么?我也遇到这样的问题了

能告诉我吗?
谢谢了!
我也很困惑!
我的邮箱2006shaqiang@163.com
页: [1]
查看完整版本: 急!复杂函数调用是怎么传递参数