引数の数を固定せずに使いたい
MATLABで関数を使って計算する機会が増えてくると、次のような問題に直面すると思います。
- 関数を定義しても使い方が状況によって変わり、毎回変えるのが手間
- 引数があまりに増えると、記述が現実的でない
- 引数をまとめて、見た目もスッキリ整えたい
引数の数を可変の関数を定義するには
事前に決まった引数を定義せずに、関数を作りたい場合は、vararginを使います。 varargin{数字}、で「数字」個目の引数を取り出すことができます。
changable_arg.m
function out = changable_arg(varargin)
arg1 = varargin{1}; % 1つ目の引数を取り出す
arg2 = varargin{2}; % 2つ目の引数を取り出す
arg3 = varargin{3}; % 3つ目の引数を取り出す
out = ****
end
引数の数を可変の関数の具体例
受け取った全ての引数の総和を出力する関数です。 varargin{:}で引数の全ての値を取り出し、[varargin{:}]として配列に入れています。
changable_arg.m
function out = changable_arg(varargin)
arg1 = varargin{1}; % 1つ目の引数を取り出す
arg2 = varargin{2}; % 2つ目の引数を取り出す
arg3 = varargin{3}; % 3つ目の引数を取り出す
fprintf("arg1: %d \n", arg1); %変数の確認
fprintf("arg2: %d \n", arg2); %変数の確認
fprintf("arg3: %d \n", arg3); %変数の確認
in_array = [varargin{:}]; %全ての引数を配列に取り出す
fprintf("in_array:");
disp(in_array) %変数の確認
out = sum(in_array); %変数の総和
次のコードで、上で作ったchangable関数が意図通りに動くか確かめます。 Case1では、3個の引数で、総和は60となるはずです。 Case2では、10個の引数で、総和は55となっていれば良さそうです。
main.m
fprintf("---Case1--- \n");
result = changable_arg(10, 20, 30);
fprintf("out: %d \n", result)
fprintf("\n\n ")
fprintf("---Case2--- \n");
result = changable_arg(1,2,3,4,5,6,7,8,9,10);
fprintf("out: %d \n", result);
main.mの実行結果
>> main
---Case1---
arg1: 10
arg2: 20
arg3: 30
in_array: 10 20 30
out: 60
---Case2---
arg1: 1
arg2: 2
arg3: 3
in_array: 1 2 3 4 5 6 7 8 9 10
out: 55
中間データのarg1, arg2, arg3, 総和(out)は、期待通りの値が得られてそうです。