[解決済み】MATLABで1つのファイルに複数の関数を定義して、そのファイルの外からアクセスすることは可能ですか?
質問
私がEEの学部生として勉強していたとき、MATLABは、たとえワンライナーであっても、各関数を独自のファイルで定義することを要求しました。
今、大学院で勉強しているのですが、MATLABでプロジェクトを書かなければならないのです。これは、新しいバージョンのMATLABでもまだ必要なことなのでしょうか?
1つのファイルに複数の関数を入れることが可能な場合、何か制限はありますか?例えば、ファイル内のすべての関数にファイル外からアクセスできるのか、それともファイル名と同じ名前の関数にのみアクセスできるのか?
注:MATLAB リリース R2007b を使用しています。
どのように解決するのですか?
m-fileの最初の関数(すなわち 主関数 が呼び出されたときに起動されます。これは 必須 は、main関数がmファイルと同じ名前である必要がありますが、わかりやすくするために、以下のようにします。 すべき . 関数名とファイル名が異なる場合は ファイル名 は、main関数を呼び出すために使用されなければなりません。
と呼ばれるm-file内の後続の関数はすべて ローカル関数 (古い用語ではサブファンクション)は、main関数とそのmファイル内の他のローカル関数によってのみ呼び出すことができます。他のm-fileにある関数はそれらを呼び出すことができません。R2016bから、次のことができるようになりました。 スクリプトにローカル関数を追加する ただし、スコープの動作はこれまでと同じです (つまり、スクリプト内からしか呼び出すことができません)。
さらに、関数 内 という関数があります。これらは ネストされた関数 これらはネストされた関数の中からしか呼び出すことができません。また、ネストされた関数内の変数にアクセスすることもできるため、少し扱いにくいですが非常に便利です。
もっと考えるべきは...
上記のような通常の関数スコープの動作を回避する方法がいくつかあります。
関数ハンドル
の回答で述べられているように、出力引数として
SCFrench
と
ヨナス
(R2013bから、この機能は
localfunctions
という関数があります)。しかし、関数やファイルの整理にはもっと良い方法がありそうなので、このようなトリックに頼ることを習慣にすることはお勧めしません。
例えば、メイン関数である
A
mファイル内の
A.m
ローカル関数と一緒に
D
,
E
および
F
. ここで、他に2つの関連する関数があるとします。
B
と
C
mファイルでは
B.m
と
C.m
をそれぞれ呼び出すことができるようにしたい。
D
,
E
および
F
. 以下は、その選択肢です。
-
置く
D
,E
およびF
をそれぞれ別のm-fileに記述し、他の関数から呼び出すことができるようにしました。欠点は、これらの関数のスコープが大きく、単にA
,B
およびC
しかし、これは非常にシンプルであることが利点です。 -
を作成します。
defineMyFunctions
m ファイル (Jonas の例と同じ) にD
,E
およびF
をローカル関数とし、それらに関数ハンドルを返すだけのメイン関数を用意しました。これによってD
,E
およびF
を呼び出すことができる関数はすべて、これらの関数のスコープに関して何もしません。defineMyFunctions
はそれらを呼び出すことができます。また、関数のハンドルを引数として渡して、必要な場所にあるかどうかを確認する必要があります。 -
コピー
D
,E
とF
をB.m
とC.m
をローカル関数として使用します。これにより、これらの関数の使用範囲はA
,B
およびC
しかし、同じコードのコピーを3つも別々の場所に置くことになるので、コードの更新やメンテナンスは悪夢のようなものになります。 -
使用方法 プライベート機能 ! もし、あなたが
A
,B
およびC
というサブディレクトリを同じディレクトリに作成します。private
を配置しD
,E
およびF
を、それぞれ別のm-fileとして入れています。これは、直上のディレクトリにある関数からしか呼び出されないように、その範囲を制限するものです(すなわちA
,B
およびC
)を同じ場所にまとめておきます(ただし、異なるm-fileのままです)。myDirectory/ A.m B.m C.m private/ D.m E.m F.m
これらはすべて、ご質問の範囲からやや外れており、おそらくあなたが必要とするよりも詳細ですが、私はあなたのすべてのMファイルを整理するという、より一般的な懸念に触れることが良いかもしれないと思いました。)
関連
-
[解決済み] matlabエディタで複数の行をコメントするためのショートカットキーはありますか?
-
[解決済み] Matlab. 位置2のインデックスが配列の境界を越えています(1を超えてはいけません)。
-
[解決済み] Matlabの角括弧と中括弧の違い?
-
[解決済み] matlabで関数ハンドルを使った操作
-
[解決済み] 部分ピボッティングによるLU分解 Matlab
-
[解決済み] なぜSIFTはMatlabで利用できないのですか?
-
[解決済み] Matlabによる最急降下法の実装
-
[解決済み] matlabの*と.*の違いは何ですか?
-
[解決済み] Wolfram AlphaとMATLABでは伝達関数のプロットが異なる
-
[解決済み] 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
-
[解決済み] matlabでhashtables/hashmapsを使う方法はありますか?重複
-
[解決済み] matlab で "カラーマップ" プロットを作成するにはどうすればよいですか?
-
[解決済み] Matlabでファイル名を変更する - movefileがファイルの代わりにフォルダを作成する
-
[解決済み] MATLABで音を止めるには?
-
[解決済み] 入力引数が多すぎる Matlab ode45
-
[解決済み] Matlabでforward inputnames?
-
[解決済み] RGBカラーによるMATLABプロット
-
[解決済み] MATLABでヒストグラムを正規化する方法は?
-
[解決済み] MATLAB OOPは遅いですか、それとも私が何か間違っていますか?