[解決済み] MATLABエラー "このコンテキストでは関数定義は許可されていません。" [重複しています]。
2022-02-05 07:37:57
質問事項
重複の可能性があります。 "プロンプトやスクリプトでの関数定義は許可されていません "の修正方法
当然のことながら、MATLAB内で以下のMスクリプトを実行しようとすると、エラーが発生します。
??? エラーです。File: kalmanmle.m Line: 47 Column: 1 関数定義はこの文脈では許可されません。
このように実行できるかどうか不安です。あるいは、MATLABのコマンドラインでこれをどのように実行すればよいのでしょうか?
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
. また
endfunction
というキーワードがありますが、MATLABでは単に
end
.
もし、あなたが
する
すべてを1つのファイルに収めたい場合は、スクリプトを関数そのものにする必要があります。
function functionnamewhichmatchesfilename
を1行目として追加し
function ret=MyLikelihoodFn(p)
をファイルの一番最後に追加してください(今は、スクリプトのコードの途中にあるようです?) また、この場合は
clear all
なぜなら、関数は常にそれ自身のクリーンなワークスペースから始まるからです。
関連
-
[解決済み] KroneckerDelta - matlab
-
[解決済み] 部分ピボットによるガウス消去の実装【終了しました
-
[解決済み] matlabでrandnを持つ確率変数の範囲はどうなっていますか?
-
[解決済み] matlab で "カラーマップ" プロットを作成するにはどうすればよいですか?
-
[解決済み] ベクトルにおける四分位値の0.25から0.75までの数値 MATLAB
-
[解決済み] MATLABとラスタープロット
-
[解決済み] 指定された矩形に含まれる配列中の点を見つける( matlab )
-
[解決済み] mnrfitを用いたmatlabでのロジスティック回帰
-
[解決済み] Matlabでのリッジ回帰とOLS回帰
-
[解決済み] 関数から返されたMATLAB配列を、最初にローカル変数に代入せずにインデックスを作成するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】"配列のインデックスは正の整数または論理値でなければならない"
-
[解決済み】Matlab: 黒を使わないグレースケールでのimagescの使用
-
[解決済み】MATLABのエラー「この課題にはスカラー構造が必要です」は、この文の何を指しているのか?
-
[解決済み] matlabエディタで複数の行をコメントするためのショートカットキーはありますか?
-
[解決済み] 第一差分フィルタ
-
[解決済み] MATLABで1つの点の最近傍を検索する
-
[解決済み] グラフと関係のないカスタム凡例を追加する
-
[解決済み] 減衰比一定の直線と根元の軌跡との交点を求めるためのrlocfindの代替プログラム(Matlab
-
[解決済み] Matlabでファイル名を変更する - movefileがファイルの代わりにフォルダを作成する
-
[解決済み] Matlab の imrect を用いて,新しい矩形の座標を取得します.