構造体の関数を別の関数内で使うには
4 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
アプリ「回帰学習器」で作成したガウス過程回帰モデルを構造体としてワークスペースにエクスポートしました。
その構造体を別の関数内で使いたいと考えているのですが、以下のようになり上手くいきません。
・A_xnew: 1×11のtable
・A_ini_ind: ワークスペース内の50×11のtable
・A_trainedModel: アプリで作成した構造体
----------------------------------------------------------------------------------------------------------------------
function t = A(A_xnew)
t = min(A_trainedModel.predictFcn(A_ini_ind)) - A_trainedModel.predictFcn(A_xnew)
end
----------------------------------------------------------------------------------------------------------------------
以上を関数A(A_xnew)として実行すると、"名前 A_trainedModel.predictFcn を解決できません。"と出力されます。
私自身の知識不足であることは承知なのですが、解決する方法をご回答いただけると嬉しいです。
0 Commenti
Risposta accettata
Kojiro Saito
il 1 Nov 2021
スクリプトを実行している「ベースワークスペース」と関数Aの「関数ワークスペース」の見え方の違いが原因です。
こちらのドキュメントに説明がありますが、
---
"ベース ワークスペース" にはコマンド ラインで作成した変数が保存されます。これには、コマンド ラインまたはエディターから実行したスクリプトによって作成される変数もすべて含まれます。ベース ワークスペースの変数は、ユーザーがクリアするか、MATLAB® セッションを終了するまで存続します。
関数は、ベース ワークスペースを使用しません。関数には、それぞれ独自の "関数ワークスペース" があります。各関数のワークスペースは、データの整合性を確保するためにベース ワークスペースやその他のワークスペースとは分離しています。共通ファイル中のローカル関数にも、それぞれ専用のワークスペースがあります。関数ワークスペースに固有の変数は "ローカル" 変数と呼ばれます。一般に、ローカル変数はその関数呼び出しが終了するとメモリから削除されます。
---
今のベースワークスペースにあるA_trainedModelやA_ini_indが関数Aの中の関数ワークスペースに存在しないことが原因です。
いくつか解決方法はありますが、関数の入力引数を3つに変更して、
function t = A(A_xnew, A_trainedModel, A_ini_ind)
スクリプトから呼び出すときに
out = A(A_xnew, A_trainedModel, A_ini_ind)
と3つのの入力を与える方法が簡単です。
他にはグローバル変数を使うとか、evalinでベースワークスペースの変数を取ってくるやり方もあります。
例えばevalinを使う方法は以下のとおりです。
function t = A(A_xnew)
A_trainedModel = evalin('base', 'A_trainedModel');
A_ini_ind = evalin('base', 'A_ini_ind');
t = min(A_trainedModel.predictFcn(A_ini_ind)) - A_trainedModel.predictFcn(A_xnew)
end
Più risposte (0)
Vedere anche
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!