構造体の関数を別の関数内で使うには

5 ビュー (過去 30 日間)
Naro
Naro 2021 年 11 月 1 日
コメント済み: Naro 2021 年 11 月 1 日
アプリ「回帰学習器」で作成したガウス過程回帰モデルを構造体としてワークスペースにエクスポートしました。
その構造体を別の関数内で使いたいと考えているのですが、以下のようになり上手くいきません。
・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 を解決できません。"と出力されます。
私自身の知識不足であることは承知なのですが、解決する方法をご回答いただけると嬉しいです。

採用された回答

Kojiro Saito
Kojiro Saito 2021 年 11 月 1 日
スクリプトを実行している「ベースワークスペース」と関数Aの「関数ワークスペース」の見え方の違いが原因です。
こちらのドキュメントに説明がありますが、
---
"ベース ワークスペース" にはコマンド ラインで作成した変数が保存されます。これには、コマンド ラインまたはエディターから実行したスクリプトによって作成される変数もすべて含まれます。ベース ワークスペースの変数は、ユーザーがクリアするか、MATLAB® セッションを終了するまで存続します。
関数は、ベース ワークスペースを使用しません。関数には、それぞれ独自の "関数ワークスペース" があります。各関数のワークスペースは、データの整合性を確保するためにベース ワークスペースやその他のワークスペースとは分離しています。共通ファイル中のローカル関数にも、それぞれ専用のワークスペースがあります。関数ワークスペースに固有の変数は "ローカル" 変数と呼ばれます。一般に、ローカル変数はその関数呼び出しが終了するとメモリから削除されます。
---
今のベースワークスペースにあるA_trainedModelA_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
  1 件のコメント
Naro
Naro 2021 年 11 月 1 日
ご回答誠にありがとうございます。まさに私が探していた機能です。
その他の複数の関数も同様の変数および構造体を使用するに加え、変数をA_xnewとする目的関数を作成したかったため、ベースワークスペースの変数から取ってくる方法を使用することとしました。
コ―ドはいずれも正常に動作いたしました。

サインインしてコメントする。

その他の回答 (0 件)

製品


リリース

R2021a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!