MATLAB错误“在此上下文中不允许使用函数定义". [英] MATLAB error "Function definitions are not permitted in this context."

查看:3012
本文介绍了MATLAB错误“在此上下文中不允许使用函数定义".的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

可能重复: 如何更正";在提示或脚本中不允许使用函数定义

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

毫不奇怪,如果我尝试在MATLAB中运行以下M脚本,则会收到错误消息

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

???错误:文件:kalmanmle.m行:47列:1 在这种情况下,不允许使用函数定义.

??? Error: File: kalmanmle.m Line: 47 Column: 1 Function definitions are not permitted in this context.

我不确定这是否可以像我一样运行.或者,如何在MATLAB命令行上运行它?

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,'-');

推荐答案

要扩展Alex的答案,您需要将函数MyLikelihoodFn(p)放入一个新文件,该文件必须称为MyLikelihoodFn.m.另外,MATLAB中没有endfunction关键字,它只是end.

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.

如果要做,想将所有内容保存在一个文件中,则必须将脚本本身变成一个函数(通过添加function functionnamewhichmatchesfilename作为第一行)并将function ret=MyLikelihoodFn(p)移至文件的末尾(现在似乎在脚本代码的中间?).在这种情况下,您也不需要clear all,因为函数始终以其自己的干净工作空间开头.

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.

这篇关于MATLAB错误“在此上下文中不允许使用函数定义".的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆