开发者

MATLAB error "Function definitions are not permitted in this context." [duplicate]

This question already has answers here: Closed 11 years ago.

Possible Duplicate: How to correct “Function definitions are not permitted at the prompt or in scripts”

Not surprisingly, if I try to run the following M script within the MATLAB I get the error

??? Error: File: kalmanmle.m Line: 47 Column: 1 Function definitions are not permitted in this context开发者_Go百科.

I am unsure if this can be run like the way I am. Or, how would I run this on the MATLAB command line?

clear all;

%  State space reprsentation to be forcasted by kalman filter
%   zhi(t+1) = F*zhi(t) + v(t+1)   --> unbobserved varaibles
%   v~N(0,Q)
%   y(t) = A'*x(t) + H'*zhi(t) + w(t)
%   w~N(0,R)

global y;
global x;
global Hvec;
%%----    Enter  Input parameters
F = 0.9;
Q = 0.1;
A = 2;
n = 100;
Hvec = zeros(n,1); %index returns process
indexshock = normal_rnd(0,0.1,n,1);
Hvec(1) = 0;
for i = 2:n,
    Hvec(i) = 0.95*Hvec(i-1) + indexshock(i);
end

%H = 0.3;
R = 0.05;

x = ones(n,1);
zhi = zeros(n,1);
y = zeros(n,1);
zhi(1) = 0;
v = normal_rnd(0,Q,n,1);
w = normal_rnd(0,R,n,1);

H = Hvec(1);
y(1) = A'*x(1) + H'*zhi(1) + w(1);
for i = 2:n,
    H = Hvec(i);
    zhi(i) = F*zhi(i-1) + v(i);
    y(i) = A'*x(i) + H'*zhi(i) + w(i);
end
%% ------------------
%test = [zhi y]

function ret = MyLikelihoodFn(p)
    global y;
    global x;
    global Hvec;
    F = p(1);
    Q = p(2)^2;
    A = p(3);
    R = p(4)^2;
    n = size(y,1);
    P = Q;
    Ezhi = 0;
    Ezhivec = zeros(n,1);
    Ezhivec(1) = Ezhi;
    tmpsum = 0;
    tmp1 = -(n/2)*log(2*pi);
    for i = 2:n,
        yt = y(i);
        xt = x(i);
        H = Hvec(i);
        Ezhi = F*Ezhi + F*P*H*inv(H'*P*H+R)*(yt-A'*xt-H'*Ezhi);
        P = F*P*F' - F*P*H*inv(H'*P*H+R)*H'*P*F' + Q;
        Ezhivec(i) = Ezhi;
        tmpmat = H'*P*H + R;
        tmp2 = -0.5*log(det(tmpmat));
        tmpmat2 = yt - A'*xt - H'*Ezhi;
        tmp3 = -0.5*tmpmat2'*inv(tmpmat)*tmpmat2;
        tmpsum = tmp1+tmp2+tmp3;
    end
    ret = -tmpsum;
endfunction

param = zeros(4,1);
param(1) = 0.2;
param(2) = 0.2;
param(3) = 1;
param(4) = 0.2;

resultparam = fmins('MyLikelihoodFn',param)

actualF = F
F = resultparam(1)
actualQ = Q
Q = resultparam(2)^2
actualA = A
A = resultparam(3)
actualR = R
R = resultparam(4)^2

n = size(y,1);
P = Q;
Ezhi = 0;
Ezhivec = zeros(n,1);
Ezhivec(1) = Ezhi;

for i = 2:n,
    yt = y(i);
    xt = x(i);
    H = Hvec(i);
    Ezhi = F*Ezhi + F*P*H*inv(H'*P*H+R)*(yt-A'*xt-H'*Ezhi);
    P = F*P*F' - F*P*H*inv(H'*P*H+R)*H'*P*F' + Q;
    Ezhivec(i) = Ezhi;
end
test = [zhi Ezhivec Hvec y];
tmp = 1:n;
%plot(tmp,zhi,'-',tmp,Ezhivec,'-',tmp,Hvec,'-',tmp,y,'-');
plot(tmp,zhi,'-',tmp,Ezhivec,'-');


You can't define functions in script files (a .m file which isn't a function definition). They must be in an .m file of their own. This is annoying, but the way it is. For very short functions, you can make anonymous functions on the fly, but these are limited in their content:

 fun = @(params) STATEMENT;

 fun = @(x,y) x*y+sum(x^2-y^2);

Your example above is a bit too complex for this.


To expand on Alex's answer, you need to put your function MyLikelihoodFn(p) into a new file which must be called MyLikelihoodFn.m. Also, there is no endfunction keyword in MATLAB, it is just end.

If you do want to keep everything in one file, you have to turn your script into a function itself (by adding function functionnamewhichmatchesfilename as a first line) and move function ret=MyLikelihoodFn(p) to the very end of the file (right now it seems to be in the middle of the code of the script?). In this case you also won't need the clear all since a function always starts with its own clean workspace.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜