関数がf()
ありmy_file.m
、それをスクリプトであるで使用したいとします。
- 関数をで定義することは可能
my_file.m
ですか? - そうでない場合は、で定義されていると仮定し
f.m
ます。どうすればそれを呼び出すことができmy_file.m
ますか?
オンラインドキュメントを読みましたが、これを行うための最良の方法が明確ではありませんでした。
関数が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
assignin
。それは私がもっと使っているかもしれないすてきな機能です!
あなたはこのようなことをすることができます(あなたのファイルが名前を付けられていると仮定してmy_file.m
):
function my_file
%script here
end
function out = f(in)
%function here
end
実行ボタンをクリックすると、関数my_file
がデフォルトで実行されます。
1)スクリプト内に関数をネストすることはできません。
2)fmがパス上または現在のディレクトリにあることを確認し、他の関数と同じように呼び出すことができます。
f
スクリプト内(彼の例)から関数(彼の例)を呼び出すこともできますmy_file
。
私はジョンによるソリューションを実装しました、そしてそれが役に立つと思いました。ただし、いくつかの注意点があります(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関数を実行しますがmyfunc
、clear all
がアクティブであるかどうかは検出されません。
chessofnerdが指摘しているように、すぐに使用できるmain関数の変数はワークスペースに移動しません。