web-dev-qa-db-ja.com

MATLABでは、同じファイルにスクリプトと関数定義を含めることができますか?

関数f()があり、my_file.m(スクリプト)で使用したいとします。

  1. 関数をmy_file.mで定義することは可能ですか?
  2. そうでない場合は、f.mで定義されているとします。 my_file.mで呼び出すにはどうすればよいですか?

私はオンラインドキュメントを読みましたが、これを行うための最良の方法が何であるかは明確ではありませんでした。

76
Viktor

リリースR2016bでは、次のように スクリプト内のローカル関数 を使用できます。

data = 1:10;            % A vector of data
squaredData = f(data);  % Invoke the local function

function y = f(x)
  y = x.^2;
end

リリースR2016bより前では、MATLABスクリプト内で定義できる唯一の 関数のタイプ匿名関数 でした。例えば:

data = 1:10;            % A vector of data
f = @(x) x.^2;          % An anonymous function
squaredData = f(data);  % Invoke the anonymous function

匿名関数は、単一の式で定義する必要があるため、単純な操作により適していることに注意してください。より複雑な関数の場合、独自のファイルで定義する必要があります MATLABパスのどこかに配置する スクリプトにアクセスできるようにし、他の場合と同様にスクリプトから呼び出します関数。

48
gnovice

この制限を回避する方法は、スクリプトを引数のない関数に変換することです(グローバルネームスペースから変数が必要な場合は、関数で明示的に渡すか、「evalin」を使用して取得します)。

次に、必要なすべての追加機能を「スクリプト」で定義できます。これはハックですが、いくつかの重要な機能が必要な場合には非常に強力であることがわかりました。

編集:これは簡単な例です。これらはすべて単一のファイルに保存できます。

function [] = myScriptAsAFunction()
   img = randn(200);
   img = smooth(img);
   figure(1);
   imagesc(img);
   axis image;
   colorbar;
end

function simg = smooth(img)
    simg = img / 5;
end
37
John

このようなことができます(ファイルの名前がmy_file.m):

function my_file
   %script here
end

function out = f(in)
   %function here
end

実行ボタンをクリックすると、関数my_fileがデフォルトとして実行されます。

19
Oneiros

1)関数をスクリプト内にネストすることはできません。

2)f.mがパスまたは現在のディレクトリにあることを確認し、他の関数と同様に呼び出すことができます。

7
Rich C

R2016b以降 、スクリプト内でローカル関数を定義できます。

x = 1;
y = add1(x);

function z = add1(x)
    z = x + 1;
end
6
Suever

Johnによる解決策 を実装しました。ただし、いくつかの注意事項があります(Octaveでは、Matlabはおそらく同様に動作します)。

  1. メイン関数内のコードに補助関数を使用する前にclear allが含まれていると、機能しません。ファイルtest3.mで、clear allのコメント/コメント解除により、コードが機能する/機能しない。

    function [] = test3()
      %clear all
      a = myfunc( 1 );
      a
    endfunction;
    
    %---------------------------------
    % Auxiliary functions
    
    function retval = myfunc( a )
      retval = 2 * a;
    endfunction;
    

    スクリプトを実行すると、関数の外部のコードが実行される最初のパス(この場合、そのようなコードはありません)、および定義された関数(この場合、test3およびmyfunc)はワークスペースに追加されます。 2番目のパスはmain関数を実行しますが、clear allがアクティブな場合、myfuncは見つかりません。

  2. Chessofnerdが指摘したように、すぐに使用できるメイン関数の変数はワークスペースに移動しません。

3
sancho.s

サンプルファイルには多くの関数を含めることができます。ただし、ファイルを実行すると、最初の関数のみがメイン関数として機能します。その他は、このファイルでのみ使用できます。状況によっては、大きな関数を定義したい場合があります。それをより小さな関数に分割し、その下で定義できます。

ただし、答えを見つける最も簡単な方法は、試してみることです〜

2
Ayo Dollars