FreeMat v4.0 日本語ドキュメント
関数およびスクリプト

 

ドキュメント目次

--------------------------------------------------------------------
function 関数宣言

関数mファイルの作成(宣言)を行います。

 [構文]

 function [out_1,...,out_M,varargout]
			 = fname(in_1,...,in_N,varargin)
out_1,...,out_M,varargoutは、出力引数です。varargout
は、出力引数が可変の場合に使用します。また出力引数の

存在しない関数の場合、これらを省略することが可能です。

in_1,...,in_N,vararginは、入力引数です。varargin
は、入力引数が可変の場合に使用します。また入力引数の
存在しない関数の場合、これらを省略することが可能です。 

 また、functionコマンドを使用して関数宣言をした関数mファイル内の変数は、外部つまりワークスペース上の変数とは名前が同じでも、同じにはなりません。例(2)を参考にしてください。

 [例]

(1) 関数mファイルと入出力引数
addtest.m

function c = addtest(a,b)
c = a + 2*b;

実行結果 
--> addtest(1,3)

ans =

7

--> addtest(3,0)

ans =

3

(2) 関数mファイル内の変数と外部変数
addtest2.m

function addtest2(a,b)
a = a + 2*b;

--> arg1 = 1

arg1 =

1

--> arg2 = 3

arg2 =

3

--> addtest2(arg1,arg2)
--> arg1

ans =

1

--> arg2

ans =

3

※ ワークスペース上で定義された変数arg1およびarg2が
関数addtest2によって影響を受けていないことがわかります。
これは、関数mファイルの変数はベースのワークスペースとは
別のメモリ空間で管理されるため干渉しない、ということに
よります。 

(3)関数mファイル内の変数と外部変数(その2)
 mファイル内の変数を外部変数を連動させることも可能です。
addtest3.m

function addtest3(&a,b)
a = a + 2*b
※ このように「&」を用います。またこの場合aには値を
代入することは禁止されていますので、注意が必要です。
変数のみの入力です。

--> addtest3(arg1,arg2)

a =

7

--> arg1

ans =

7

--> arg2

ans =

3
(2)でのarg1とarg2を使用しています。 関数addtest3により
arg1が影響を受けていることがわかります。本機能はMATLABでは
使用できません。混同する可能性もあるので、あまり使用しない
方がよいのかもしれません。


(4)関数mファイル内のみ参照できる関数 
FreeMatではヘルパー関数というものが用意されています。
MATLABでいうサブ関数でしょうか。これはmファイル内のみ
参照できる関数です。

euclidlength.m

function y = foo(x,y)
square_me(x);
square_me(y);
y = sqrt(x+y);

function square_me(&t)
t = t^2;

--> euclidlength(3,4)

ans =

5

--> euclidlength(2,0)

ans =

2


--------------------------------------------------------------------

anonymous 匿名関数

匿名関数はよくインライン関数の代用として用いられます。

[構文]

 y = @(arg1,arg2,...,argn) expression
argi(I=1,2,・・・)は引数、expressionは式の表現、yは
ハンドルとなります。 例えば以下のような形になります。

 y = @(x) a*(x+b)

aおよびbは、ワークスペース上に定義されている必要があります。ハンドルyを使用した実行の方法は、以下の3通りがあります。

 p = y(3)
p = y()
p = feval(y,3)

 [例]

--> a = 2; b = 4; 
--> y = @(x) a*x+b 

y =

@(x) a*x+b Xreate the anonymous function


--> y(2)

ans =

8

次にa,bを再定義します。

--> a = 5; b = 7; 
--> y(2) 

ans =

8

しかしながら結果が変わりません。そこで再び匿名関数を再定義します。

--> y = @(x) a*x+b 

y =

@(x) a*x+b


--> y(2)

ans =

17

このように値が反映されます。

--------------------------------------------------------------------
keywords キーワードによる引数の割り当て

 本機能も用いることにより、引数を任意の順に与えることができます。また可変変数の際、MATLABではnarginを用いて一個ずつ判定し処理を決定していましたが、本機能を使用することによりこの記述が不要となり、

・プログラムが簡略化

・判定不要により処理の軽減および計算速度の向上

が実現でき大変有効です。

  [構文]

function [out_1,...,out_M] = foo(in_1,...,in_N)

foo(val_1, val_2, /in_k=3)

[例]

keyfunc.m

function c = keyfunc(a,b,operation,printit)
if (~isset('a') | ~isset('b'))
error('keyfunc requires at least the first two 2 arguments');
end;
if (~isset('operation'))
% ユーザが第三入力引数を設定しない場合は「+」とする
operation = '+';
end
if (~isset('printit'))
% ユーザが第四入力引数を設定しない場合は、「false」とする
printit = 0;
end
% 処理
eval(['c = a ' operation ' b;']);
if (printit)
printf('%f %s %f = %f\n',a,operation,b,c);
end

実行例

--> keyfunc(1,3) 

ans =

4

--> keyfunc(1,3,/printit)
1.000000 + 3.000000 = 4.000000

ans =

4

--> keyfunc(/operation='-',2,3)

ans =

-1

--> keyfunc(4,/operation='*',/printit) % error as b is unspecified
Error: keyfunc requires at least the first two 2 arguments

--------------------------------------------------------------------
varargin 可変数入力引数

最後の入力引数にvararginを使用することにより、可変数の入力引数をとることが可能です。

  [構文]

 function [out_1,...,out_M] = fname(in_1,..,in_M,varargin)

  [例]

wrapcall.m

function wrapcall(fname,varargin)
feval(fname,varargin{:});

--> wrapcall('printf','%f,%f',pi,e)

3.141593...2.718282

--------------------------------------------------------------------
varargout 可変数出力引数

最後の出力引数にvarargoutを使用することにより、可変数の出力引数を割り当てることが可能です。

  [構文]

 function [out_1,...,out_M,varargout] = fname(in_1,...,in_M)
out_M以降の出力引数は、varargoutというセル配列に格納されます。 
 [例]

varoutfunc.m

function [varargout] = varoutfunc
switch(nargout)
case 1
varargout = {'one of one'};
case 2
varargout = {'one of two','two of two'};
case 3
varargout = {'one of three','two of three','three of three'};
end
実行例
--> [c1] = varoutfunc
c1 =

one of one

--> [c1,c2] = varoutfunc
c1 =

one of two

c2 =

two of two

--> [c1,c2,c3] = varoutfunc
c1 =

one of three

c2 =

two of three

c3 =

three of three

--------------------------------------------------------------------
script スクリプトファイル

mファイルの中にコマンドラインに入力するコマンドを羅列することでバッチ処理ができる機能です。ここで定義された変数はワークスペース上の変数と同一のものとなります。

 [例]
tscript.m

a = 13;
printf('a is %d\n',a);
b = a + 32
実行例
--> tscript
a is 13

b =

45

ワークスペース上の変数を確認します。
--> who
Variable Name Type Flags Size
a int32 [1 1]
ans double [0 0]
b int32 [1 1]


スクリプトmファイル内の変数が同一であることが確認できます。

--------------------------------------------------------------------

nargin 入力引数の数

入力引数の数をカウントし、narginという変数へ格納します。

 [例] 
nargintest.m

function nargintest(a1,a2,a3,a4,a5)
printf('nargin = %d\n',nargin);


実行例

--> nargintest(3);
nargin = 1
--> nargintest(3,'h');
nargin = 2
--> nargintest(3,'h',1.34);
nargin = 3
--> nargintest(3,'h',1.34,pi,e);
nargin = 5


--------------------------------------------------------------------
nargout 出力引数の数

出力引数の数をカウントし、nargoutという変数へ格納します。

 [例] 
nargouttest.m
function [a1,a2,a3,a4,a5] = nargouttest
printf('nargout = %d\n',nargout);
a1 = 1; a2 = 2; a3 = 3; a4 = 4; a5 = 5;

実行例

--> a1 = nargouttest
nargout = 1

a1 =

1

--> [a1,a2] = nargouttest
nargout = 2
a1 =

1

a2 =

2

--> [a1,a2,a3] = nargouttest
nargout = 3
a1 =

1

a2 =

2

a3 =

3

--> [a1,a2,a3,a4,a5] = nargouttest
nargout = 5
a1 =

1

a2 =

2

a3 =

3

a4 =

4

a5 =

5


--------------------------------------------------------------------

special その他

FreeMatは以下のような3つの構文で関数を実行させることができる。

  [構文]

 functionname('arg1','arg2',...,'argn')
 functionname 'arg1' 'arg2' ... 'argn'
 functionname arg1 arg2 ... argn


  [例]

strcattest.m

function strcattest(str1,str2)
str3 = [str1,str2];
printf('str1 = %s, str2 = %s, str3 = %s\n',str1,str2,str3);

実行例

--> strcattest('hi','ho')
str1 = hi, str2 = ho, str3 = hiho
--> strcattest 'hi' 'ho'
str1 = hi, str2 = ho, str3 = hiho
--> strcattest hi ho
str1 = hi, str2 = ho, str3 = hiho