1. ホーム
  2. マットラボ

[解決済み】MATLABで1つのファイルに複数の関数を定義して、そのファイルの外からアクセスすることは可能ですか?

2022-04-06 07:30:53

質問

私が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つの関連する関数があるとします。 BC mファイルでは B.mC.m をそれぞれ呼び出すことができるようにしたい。 D , E および F . 以下は、その選択肢です。

  • 置く D , E および F をそれぞれ別のm-fileに記述し、他の関数から呼び出すことができるようにしました。欠点は、これらの関数のスコープが大きく、単に A , B および C しかし、これは非常にシンプルであることが利点です。

  • を作成します。 defineMyFunctions m ファイル (Jonas の例と同じ) に D , E および F をローカル関数とし、それらに関数ハンドルを返すだけのメイン関数を用意しました。これによって D , E および F を呼び出すことができる関数はすべて、これらの関数のスコープに関して何もしません。 defineMyFunctions はそれらを呼び出すことができます。また、関数のハンドルを引数として渡して、必要な場所にあるかどうかを確認する必要があります。

  • コピー D , EFB.mC.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ファイルを整理するという、より一般的な懸念に触れることが良いかもしれないと思いました。)