MATLABユーザーコミュニティー

Matlab&Si金宝appmulinkユーザーコミュニティー向け日本语ブログ

MATLAB函数ブロックを使いこなせ!

皆さんこんにちは。トレーニングトレーニングエンジニアの远藤と申し申し
このブログでは,「金宝appsimulinkとmatlabをを「」をコンセプトとして,主に技术的ななについて书籍てており。

今回フォーカスを当てていくのは、「金宝appSimulink」とMATLABをつなぐ」機能の一つである「MATLAB函数」ブロック」です。普段 MATLABをメインで使用している方は、

  • MATLABで使っていたコードを 模金宝app拟でも使いたい!
  • ブロック線図で複雑な演算を作るのが苦手!

といった理念で,このmatlab功能ブロックブロックを使场面ががががううう。

この記事では、そんなMATLAB函数ブロックを使う上での主要なつまづきポイントとその解決策についてまとめていきたいと思います!

Matlab功能ブロックとは

まず初めに、MATLAB函数ブロックについて簡単に説明します。MATLAB函数ブロックは、MATLABの関数を用いて動作を自分でカスタマイズすることができるブロックです。

MATLAB函数ブロックは、関数形式でブロックの動作を設定します。通常のブロックはダブルクリックするとブロックダイアログが開きますが、MATLAB函数ブロックの場合は MATLABの関数編集画面が開きます。

デフォルトではは力をそのまま力するよう关键词がをさ编集いいくことで,入力と出のいくでできる,とカスタできる,ととできる。

ちなみに,关节の入出力量はブロックの力端子に対応しので,关键词数量の変えると,ブロックのの子のもます。复数の入出が必要ます。编集しましょう。

もっと详しい使い方向が知りは,matlab功能ブロックのドキュメントもご確認ください。

Matlab功能ブロックのつまづきポイント

MATLAB函数ブロックは、通常の MATLAB関数のようにブロックの動作を書くことができるため、特にメインで MATLABを使っている人は親しみやすいブロックかと思います。

しかし,matlab功能ブロックはあくまでsimulinkの金宝app机能のですので,通讯のmatlabの关键とと使い胜手胜手が异なるもありためためためためためますますますますますますためためますますますますますますますますますますますますますますますますますますますますますますますますますますますますでfunctionますますますますますな感覚でfunction functionfunctionます同じ同じ同じような感覚function function functionfunctionをををを使っいるいるfunction functionエラーが生长してしまいます。

そこで、この記事では MATLAB函数ブロックを使う際に特につまづきやすい4.つポイントにフォーカスを当て、それぞれの解決策を解説していきます!

【つまづきポイント1】一圈关有关部が使え!
【つまづきポイント2】过去の値が使えない!
【つまづきポイント3】ワークスペースのの数にアクセスできない!
【つまづきポイント4】配列サイズのエラーが出る!

【つまづきポイント1】一圈关有关部が使え!

例えば、MATLAB函数ブロックで以下のような処理を書いたとしましょう。

功能y=myContrast(u)
i = imresize(U,[224,224])
y = localcontrast(i);

调整大小関数で画像データを224x224にリサイズしたあと、局部对比度関数で局所的にコントラストを強調するような処理です。一見問題なく動きそうですが、実際にモデルを実行すると……

关注'localcontrast'はは生成でサポートれていません。
関数 ‘MATLAB函数“(#36.51.67)行 3.列 5:
“本地对比度(I)”

エラーが出てしまいました。これは、局部对比度関数がコード生成に対応していないことが原因です。

金宝appSimulinkはシミュレーションを行うににモデルから行走用来のを,matlab函数ブロックブロックで,一部关键词も除いもコード生成に対応しいる关键词关键词

しかし、場合によってはどうしてもコード生成対応外の関数を MATLAB函数ブロック内で使わなければならないこともあります。そういったときに使うのが、编码器.Extrinsic.というコマンドです。

编码器.Extrinsicは,特点の关节を生成対象外にするです。これこれを使うこと,コード生成にししない关键字でmatlab函数ブロックブロックで使使用

それでは,先ほど先ほどコードで译者。

功能y=myContrast(u)
编码器.Extrinsic(“本地对比度”);
i = imresize(U,[224,224]);
y = localcontrast(i);

外部编码器でエラーの原因であった 局部对比度関数をコード生成対象外に指定しました。これでOK!……かと思いきや、

このコンテキストでは,关节の出力'y'をmx arrayにはできませんんのタイプタイプもつもつする事前すること検讨しててこと検讨​​しててこと検讨​​してててしして

今度は別のエラーが出てしまいました。どうやら出力 Yが問題のようですが、何が原因なのでしょうか……?

実は,编码器。Extrinsicを使う际,コード生成対象外に指定した関数から返ってくる値のデータ型やサイズを金宝app模拟に明確に教えてあげる必要があるのです。外部编码器で指定された関数は 模拟ではなく MATL金宝appABで実行されるため、模拟はこの関数からどんな値が返ってくるか全く知りません。そのため、この状況でシミュレーションを行おうとしても、MATLAB函数ブロックから出力される Yがどんなデータ型でどれくらいのサイズなのかを判断できず、モデルの整合性が確認できないのです。

ではどうするかというと、エラーメッセージに書いてあるように、変数 Yを「初期化」してあげます。次のコードを見てください。

功能y=myContrast(u)
编码器.Extrinsic(“本地对比度”);
y=零(224,‘uint8’);
i = imresize(U,[224,224]);
y = localcontrast(i);

2行目にをuint8型の224 x 224のの行列ででするをましました。一流见无駄致理性にがた。matmatなfunctionにかもしれませんがが重要ブロックにおいてにおいては非常になな处においてなり非常非常にななになり。なぜなら、この行があることで、「loalcontrast 関数から返ってくる y という変数は、uint8 型の 224 x 224 の行列だ」ということを Simulink が判断できるようになるからです。実際、この初期化処理を入れることで、先ほどのエラーは発生しなくなります。

このこのよう,编码器。Extrinsicを用てコード生成対応外关关数を际は,変数の初期化を忘れないようにしましょう

提示:関数がコード生成に対応しているかどうかを調べるには?

既存のコードをMATLAB功能ブロックで使使する合,使っている关键が生成に対応ているか确认する必要がありいるいる确认する必要があり

一番簡単なのは、とりあえず実行してみてエラーを見る、という方法です。一番手軽で原因もわかりやすいので、基本的にはこの方法で問題ないかと思います。ただし、規模の大きなモデルの場合は、実行ボタンを押してから MATLAB函数ブロックでエラーが出るまでに時間がかかってしまうため、実行する前に事前にコード生成対応しているか把握しておく方が効率的なこともあります。

こういった場合は、ドキュメントを使って確認する方法が有効です。

例えば,こちらのドキュメントに載っているコード生成対応関数リストを使うと、特定の関数がコード生成に対応しているか確認することができます。そのほかにも、それぞれの関数のドキュメントの下部に「信用证」++コード生成対応」という表記があれば、その関数はコード生成に対応しています。

例:邻域関数のドキュメント。コード生成に対応していることがわかります。

また,一般要关关コード生成のための制约が记载されててありありありありありありありありありありありありありありありあり

例:最大关节の。致力于引がのにい制约がいれいいいいいい

特定の関数でコード生成関連のエラーが発生した場合は、何かの制約に引っかかってないかドキュメントで確認してみましょう。

注意点

外部编码器使うと、一般的にモデルの実行速度は遅くなります。また、当たり前ですが外部编码器が含まれるモデルはコード生成することができません。そのため、実行速度がクリティカルに効いてくるモデルやコード生成を行う前提のモデルは、外部编码器を使わず、コード生成対応の別の関数で代用する必要がありますので注意しましょう。

【つまづきポイント2】过去の値が使えない!

それでは次のつまづきポイントです。前のステップと今のステップの入力の平均を計算する処理を MATLAB函数ブロックで実装するにはどうすればいいでしょうか?

功能y = fcn(u)
Y =(U_OLD + U)/ 2;
u_old=u;

それっぽいコードを書いてみたものの、これではエラーとなります。通常の MATLAB関数と同様に、MATLAB函数ブロックの関数も実行ごとに変数がリセットされます。そのため、このままでは前のステップの入力を使うことができません。

このような结合ににのが,永続変数です。

永続永続は关で定义定义后后后にリセットずれず,値が残りますますてをを使え値を使っ演算うこと能ですです先ほどをの能能です先ほどのコード能能です先ほどコード能能ですコードコードコード能能先ほどコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコードコード使っ使っ书签てます。

功能y = fcn(u)
执着的你老了
如果空空如也(你老了
你老了= 0;
结尾
y=(你老了+ U)/ 2;
你老了=你;

まず、你老了の前に 持久的と書き、你老了変数を永続変数に設定します(変数名が青緑色に変わります)。一度永続変数に設定してしまえば、以後 你老了変数は関数の実行後も値がリセットされなくなりますので、前のステップの入力を保存しておき、次のステップで使う、といった芸当が可能になります。

しかし,ここで気を付けなければならないのは,永続永続数には初回実実に何も値が入っいという点です。そのため、初回実行時のみ初期値を与えてあげる必要があります。そこで、さきほどのコードの ように、一度空空如也関数を用いて永続変数に値が入っているか確認し、入っていない場合は初期値を入れる、という処理を書く必要があります。この構文は永続変数を使う際に必ず書くものなので、セットで覚えておきましょう!

注意点

MATLAB函数ブロック内で使っている永続変数の値は、シミュレーションが終わってもメモリに保存されます。そのため、もう一度シミュレーションを行うと、前回の値が残ったまま実行されてしまいます。これを防ぐには,以下のようコマンドをmatlabで実行,永続永続数をリセットます。

>>清楚的関数名%永続変数の名前ではないので注意!



【つまづきポイント3】ワークスペースのの数にアクセスできない!

MATLABでスクリプトを用いて計算を行う場合、あらかじめベースワークスペースに .小地毯ファイルなどに保存しておいたパラメータを読み込み、スクリプト内でそれを用いることが多々あります。しかし、通常の MATLAB関数と同様、MATLAB函数ブロックも直接ベースワークスペースの変数にアクセスすることはできません。

しかし、MATLAB函数ブロックのパラメータ - 数という機能を使用すると、ベースワークスペースの変数をMATLAB函数ブロック内でパラメータとして使用することができます。

パラメータ引数の使い方:

1.使用したいワークスペース上の変数と同じ名前の変数を、MATLAB函数ブロックの関数の入力引数に追加します(一時的にブロックの入力端子が増えます)。

2.エディタ上部の[データの編集]をクリックします。

3.先ほど追加した変数を選び、「スコープ」を「パラメータ」に設定します(ブロックの入力端子の数がもとに戻ります)

このようにしてパラメータ引数を設定することで、ベースワークスペースの変数を MATLAB函数ブロック内で使用することができます。ワークスペースの変数と同名の入力変数を設定しなければならない点に注意です。

注意点

よくよく勘违いされれやすいのです,シミュレーション中にベースワークスペースののを変更ても,matlab函数ブロック内のパラメータパラメータのは変わりません。なぜなら,金宝appSimulinkはシミュレーション开放前にワークのののを确认し,それを固定しパラメータとしてするです。また,その,すなわちmatlab函数ブロック内からベースワークスペースののの値値変更することもできんん。

どうしてもシミュレーション中にベースワークスペースの値を動的に参照したい、という場合は、埃瓦林assligninなどの関数を 外部编码器と組み合わせて使いましょう(詳細は各関数のドキュメントをご確認ください)。

提示:使いたい跑数量多重すぎる合并!

パラメータ引数を使うと MATLAB函数ブロックからベースワークスペースの変数にアクセスすることができますが、必要な変数が多い場合、全ての変数に対してパラメータ引数を作成するのは大変です。

このこのな综合は,変数を1つの构造体にまとめてあげるが。例えば,使いたい函数が。例えば,使いたい幂が“data.mat”というファイルに保存されれいるにははいるいるは

>>数据=负载('data.mat'

とすることで.MATファイルファイル内のををというというつの构造构造として読み込むますのでのでのでのでのでのでのでのでのでのでますますます设定するだけですべてのににするするだけですべてのを设定设定するするだけですべてををを函数ブロックブロックでで使用するするます。

ただし、MATLAB函数ブロック内では 图形オブジェクトなどの一部のデータ型の変数は使用できません。拯救関数でワークスペースの変数をすべて .小地毯ファイルに保存した場合は構造体の中に対応していない変数が混入しやすいので注意しましょう。

【つまづきポイント4】配列サイズのエラーが出る!

以下の MATLAB函数ブロックの関数を見てみましょう。

功能y = fcn(u)
Y = 0:U:10 * U;

入力に応じてベクトルを作成して出力するようなコードです。一見問題なく動くように見えますが、モデルを実行するとエラーとなります。

“是的”は可変サイズの行列と推定されますが、そのサイズは継承または固定として指定されています。’y'が、調整不可なパラメーターで定義されていることを確認するか、[可変サイズ] チェック ボックスを選択し、[サイズ] ボックスで上限を指定します。

金宝app�,配列yのの形ががようコードになっていますますコードにな场ていますなコードになってていま金宝appすコードコードになってシミュレーション前ににのははシミュレーションシミュレーション前に重

このエラーの解決方法は2.種類あります。

方法1:配列サイズが判断できる形に変更する

実行したい演算によっては、表記を変更することで 金宝app模拟が配列サイズを推測できるようになります。例えば先ほどのコードは、一見 Uの値によって配列サイズが変化しそうに見えますが、実は配列サイズは必ず 11になります。次のように書き換えるとそれが明確になりますね。

功能y = fcn(u)
y=(0:1:10)*u

この形であれば、金宝app模拟も出力信号のサイズが 11だと判断することができるため、モデルはエラーなく実行されます。

このように,もし配列サイズが入力に依存ないはずなのに配列配列に关键词より配列サイズが明显になるような形変形できかかししみましょ

方法2:可変サイズに設定する

先ほど「金宝appSimulink」では信号のサイズは基本的にシミュレーション前に決定されている」と書きましたが、例外もあります。それが可変サイズ信号です。可変サイズ信号はシミュレーション中にサイズが変更する信号です。

MATLAB功能ブロックブロックの力は,[データの编集]画面で「可」「可」,「を」,「サイズ」にに设定设定するででを设定するで,可以致以信号

この設定を行うことで、MATLAB函数ブロックからの出力信号 Yは可変サイズ信号となり、シミュレーション中でサイズが変更できるようになります。

ただし,可以サイズ信号には多くの制约が在します。例えば,可変サイズ信号のサンプルはである必要があり。制约制约こちらのドキュメントにリスト化されていますが、多くのモデルに大きな影響を及ぼしますので、可変サイズ信号を用いるべきかどうかは慎重に検討必要があります

まとめ

今回はmatlab函数ブロックを使う上で问题なる4つのつまづきポイントについてまとめまし「。「matlab函数ブロックのエラーが解决なくてsimulink使うのた......「という方金宝app向,この记事のつまづき?

皆さんもうまく MATLAB函数ブロックを用いて、快適なモデリングライフをお送りください!

|

评论

如需留言,请点击在这里登录到您的MathWorks帐户或创建新帐户。