title: MATLAB error "Function definitions are not permitted in this context."
body: <blockquote>
    <p><strong>Possible Duplicate:</strong>
    <a href="https://stackoverflow.com/questions/5969547/how-to-correct-function-definitions-are-not-permitted-at-the-prompt-or-in-script">How to correct &ldquo;Function definitions are not permitted at the prompt or in scripts&rdquo;</a></p>
  </blockquote>
  
  
  
  <p>Not surprisingly, if I try to run the following M script within the MATLAB I get the error</p>
  
  <blockquote>
    <p>??? Error: File: kalmanmle.m Line: 47 Column: 1
    Function definitions are not permitted in this context.</p>
  </blockquote>
  
  <p>I am unsure if this can be run like the way I am. Or, how would I run this on the MATLAB command line?</p>
  
  <pre><code>clear all;
  
  %  State space reprsentation to be forcasted by kalman filter
  %   zhi(t+1) = F*zhi(t) + v(t+1)   --&gt; 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,'-');
  </code></pre>