関数f()
があり、my_file.m
(スクリプト)で使用したいとします。
my_file.m
で定義することは可能ですか?f.m
で定義されているとします。 my_file.m
で呼び出すにはどうすればよいですか?私はオンラインドキュメントを読みましたが、これを行うための最良の方法が何であるかは明確ではありませんでした。
リリース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パスのどこかに配置する スクリプトにアクセスできるようにし、他の場合と同様にスクリプトから呼び出します関数。
この制限を回避する方法は、スクリプトを引数のない関数に変換することです(グローバルネームスペースから変数が必要な場合は、関数で明示的に渡すか、「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
このようなことができます(ファイルの名前がmy_file.m
):
function my_file
%script here
end
function out = f(in)
%function here
end
実行ボタンをクリックすると、関数my_file
がデフォルトとして実行されます。
1)関数をスクリプト内にネストすることはできません。
2)f.mがパスまたは現在のディレクトリにあることを確認し、他の関数と同様に呼び出すことができます。
R2016b以降 、スクリプト内でローカル関数を定義できます。
x = 1;
y = add1(x);
function z = add1(x)
z = x + 1;
end
Johnによる解決策 を実装しました。ただし、いくつかの注意事項があります(Octaveでは、Matlabはおそらく同様に動作します)。
メイン関数内のコードに補助関数を使用する前に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
は見つかりません。
Chessofnerdが指摘したように、すぐに使用できるメイン関数の変数はワークスペースに移動しません。
サンプルファイルには多くの関数を含めることができます。ただし、ファイルを実行すると、最初の関数のみがメイン関数として機能します。その他は、このファイルでのみ使用できます。状況によっては、大きな関数を定義したい場合があります。それをより小さな関数に分割し、その下で定義できます。
ただし、答えを見つける最も簡単な方法は、試してみることです〜