Matlab:我可以在函数定义中访问工作区变量吗?

时间:2016-06-30 03:41:26

标签: matlab

我想找到常量a1,b1最小化

\sum_{k=1}^{n} |a_1 x_k + b_1 - y_k|

所以我写了下面的matlab代码(nlp.m):

function NLP
x0 = ones(2, 1);
[a1b1, sum1] = fmincon(@objfun, x0, [], [], [], [], [], [], [])

function sum1 = objfun(a1b1)
sum1 = sum(abs(a1b1(1) * x + a1b1(2) - y));

在工作区

中创建xy n-vector

但是,当我运行nlp.m时,我收到以下错误:

>> nlp
Undefined function or variable 'x'.
...

似乎我无法访问工作区中定义的变量。那我该怎么办? 处理它?<​​/ p>

1 个答案:

答案 0 :(得分:0)

您可以直接从脚本访问基础工作区中的变量,但不能访问函数。 要将这些变量传递给目标函数,请参阅http://www.mathworks.com/help/optim/ug/passing-extra-parameters.html

所以你可以把你的功能改成使用这样的脚本:

% NLP - script
x0 = ones(2, 1);
f = @(a1b1)objfun(a1b1,x,y);
[a1b1, sum1] = fmincon(@f, x0)

在单独的函数中定义目标函数:

function sum1 = objfun(a1b1, x, y)
sum1 = sum(abs(a1b1(1) * x + a1b1(2) - y));

另一种方法是将基本工作区保存到文件中,并在主函数中加载此文件。 在这种情况下,您可以像这样更新您的功能:

function nlp
% save workspace variable to file
evalin('base','save(''ws.mat'',''x'',''y'');')
x0 = ones(2, 1);
s=load('ws.mat');
x=s.x;y=s.y;
f = @(a1b1)objfun(a1b1, x, y);
[a1b1, sum1] = fmincon(@f, x0);

function sum1 = objfun(a1b1, x, y)
sum1 = sum(abs(a1b1(1) * x + a1b1(2) - y));