FreeMat v4.0 日本語ドキュメント
変数および配列

 

ドキュメント目次

--------------------------------------------------------------------
struct  構造体配列の生成

 フィールドや値を設定し、構造体を作成します。一般的な構文法は次のとおりです:

 [構文]

 y = struct(n_1,v_1,n_2,v_2,...)

 n_iはフィールド名、v_iはその値です。v_iはスカラか同じ次元のセル配列で
ある必要があります。

 次元などが正しく設定されない場合はエラーが発生します。

 struct関数の他の使い方は、クラスを構造体に変換する、というものです。これはクラスの要素に直接的にアクセスできるようにします。しかしオブジェクトからクラスの情報を取り除くことはできません。

 [例]

(1) 3つのフィールドを持つ構造体を作成します。

--> y = struct('foo',{1,3,4},'bar',{'cheese','cola','beer'},'key',508)

y =
Fields
foo
bar
key
--> y(1)

ans =
foo: [1]
bar: ['cheese']
key: [508]
--> y(2)

ans =
foo: [3]
bar: ['cola']
key: [508]
--> y(3)

ans =
foo: [4]
bar: ['beer']
key: [508]


--> y(3).bar

ans =

beer

 ※ 要素の抽出はピリオド(.)を使用します。

(2) フィールドの値を直接設定します。

--> Test(2,3).Type = 'Beer';
--> Test(2,3).Ounces = 12;
--> Test(2,3).Container = 'Can';
--> Test(2,3)

ans =
Type: ['Beer']
Ounces: [12]
Container: ['Can']
--> Test(1,1)

ans =
Type: []
Ounces: []
Container: []

 このようにフィールドの値をピリオドを 使用して設定することで自動的に、フィールドを設定することもできます。

--------------------------------------------------------------------
string  文字列配列

 FreeMatは文字列配列をサポートします。文字は内部では8ビットのデータとして扱われます。一つの変数に定義できる文字列配列は全て同じ文字数でなければなりません。詳細は例(1)~(4)をご覧ください。またシングルコーテーション(’)の文字はMATLAB同様2つのシングルコーテーション(’’)で実現できます。例の(5)を参照ください。

 [例]

 (1)

--> a=['hello';'world']

a =

hello
world

 これは文字数が同じであるので定義可能。

 (2)

 --> a = ['hello';'bye']


Error: Mismatch in dimension for rows in matrix definition

 文字数が異なるので、エラーが発生します。

 (3)

 --> a = ['hello';'bye ']

a =

hello
bye
スペースを使用して文字数を合わせて定義することも可能です。

 (4)

--> a = {'hello','bye'}
a =

['hello'] ['bye']

しかし一般的に文字数のことなる文字列を定義する場合は、セル配列(中括弧を使用して定義)を使用します。

  (5)

シングルコーテーションの文字列は「’」MATLAB同様シングルコーテーションを2つ並べて定義します。 

--> a = 'I can''t use matlab'

a =

I can't use matlab

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

matrix  行列の定義

 FreeMatはMATLAB同様、大括弧([])を使用してデータを定義します。

 [構文]

 A = [row_def1;row_def2;...,row_defN]
各列の要素はカンマを使用して区切ります。 
 row_defi = [element_i1,element_i2,...,element_iM]

 [例]

(1) 

 整数を要素とする2×2の行列を定義します。これは整数なのでタイプはint32型となります。

--> A = [1,2;5,8]

A =

1 2
5 8

--> who A
Variable Name Type Flags Size
A     int32 [2 2]

(2)
 上記の変数Aに要素を追加し、あたらなBという2×3の行列を作ります。

--> B = [A,[3.2f;5.1f]]

B =

1.0000 2.0000 3.2000
5.0000 8.0000 5.1000

--> who B
Variable Name Type Flags Size
B       float [2 3]
追加の要素を「f」とfloat型にしてしたことにより、変数Bもfloat型になっていることがwhoコマンドの実行結果よりわかります。

(3)

 次に上記のBの底に、要素を加えて3×3のCという変数を定義します。加える要素には何も型を指定しないため、自動的にdouble型となります。

--> C = [B;5.2,1.0,0.0]

C =

1.0000 2.0000 3.2000
5.0000 8.0000 5.1000
5.2000 1.0000 0

--> who C
Variable Name Type Flags Size
C     double [3 3]


(4)
 次に変数Bに複素数の要素を加えます。
--> D = [B;2.0f+3.0f*i,i,0.0f]

ans =

1.0000 + 0.0000i 2.0000 + 0.0000i 3.2000 + 0.0000i
5.0000 + 0.0000i 8.0000 + 0.0000i 5.1000 + 0.0000i
2.0000 + 3.0000i 0.0000 + 1.0000i 0

--> who D
Variable Name Type Flags Size
D     complex [3 3]

(5)
 FreeMatにはdcomplexという型も存在します。 上記の変数Dとは型の
指定「f」があるかどうかが、異なります。

--> E = [B;2.0+3.0*i,i,0.0]

E =

1.0000 + 0.0000i 2.0000 + 0.0000i 3.2000 + 0.0000i
5.0000 + 0.0000i 8.0000 + 0.0000i 5.1000 + 0.0000i
2.0000 + 3.0000i 0.0000 + 1.0000i 0

--> who E
Variable Name Type Flags Size
E dcomplex [3 3]



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

cell  セル配列の定義

 セル配列はかなりパワフルな配列タイプです。なぜなら様々な型のデータを一つの配列にまとめることができるからです。C言語に慣れている方は、void * arrayと同じになりますので、これを参考にしてください.

 [構文]

 A = {row_def1;row_def2;...;row_defN}

定義には中括弧({})を使用します。

 [例]

 (1)

--> A = {14,'hello',[1:10]}

A =

[14] ['hello'] [[1 10] int32]

 (2)

2×2行列の例です。

--> B = {pi,i;e,-1}


B =

[3.14159] [0+1i]
[2.71828] [-1]


 (3)

上記のセル配列A、Bを使用して新たなセル配列を作成します。

 --> C = {A,B}

C =

{[1 3] cell } {[2 2] cell }
要素の参照は、中小括弧を使用します。このあたりはMATLABと
同様です。 
--> C{1}

ans =

[14] ['hello'] [[1 10] int32]

--> C{1}(2)

ans =

['hello']

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

global  グローバル変数

 グローバル変数とはどの関数やスクリプトからも参照・定義できる

変数のことです。

 [構文]

 global variable_1 variable_2 ...

 上記コマンドは、変数が定義される前に実行される必要があります

 [例]

 2つの関数間で変数を共有する例を下記に示します。一方の関数

内で変数を定義し(この関数では出力引数はない)、もう一方の関数

で参照します(この関数には入力引数はない)。

 ① set_global.m

function set_global(x)
global common_array
common_array = x;

 ② get_global.m

function x = get_global
global common_array
 x = common_array;
上記2つの関数を作成し、以下のコマンドを実行する。

--> set_global('Hello')
--> get_global

ans =

Hello
このようにget_globalからset_global内の変数が参照できている
ことがわかります。 

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

persistent  パーシステント変数

 パーシステント変数は、コール間で値を保持する関数です。

 [構文]

 persistent variable1 variable2 ... variableN

 上記コマンドは、値が保持される前に実行する必要があります。

 [例]

何回コールされているかカウントする関数を例として取り上げます。

count_calls.m

function count_calls
persistent ccount
if (~exist('ccount')) ccount = 0; end;
ccount = ccount + 1;
printf('Function has been called %d times\n',ccount);

実行結果

--> for i=1:10; count_calls; end

Function has been called 1 times
Function has been called 2 times
Function has been called 3 times
Function has been called 4 times
Function has been called 5 times
Function has been called 6 times
Function has been called 7 times
Function has been called 8 times
Function has been called 9 times
Function has been called 10 times

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

function  関数ハンドル

 関数ハンドルは変数内に格納された関数のエイリアスです。

 [構文]

   handle = @func

この「func」は参照する関数名です。

このハンドルを使用するには以下の2つの構文のどちらかを

使用します。

① [x,y] = feval(handle,arg1,arg2)

② [x,y] = handle(arg1,arg2)

 [例]
--> handle=@sin

--> x=0:0.01:2*pi;
--> y=feval(handle,x); %もしくは、y=handle(x);
--> plot(x,y)





実行結果

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

indexing  インデックス表現

  FreeMatには3つのタイプのインデックス機能があります。

配列のインデックス表現

 もっとも一般的なインデックスの方法です。

 [構文]

① variable(index_1,index_2,...,index_n)
 ※ index_i はスカラ(i=1,2,・・・)
② variable(index)
 ※ indexはベクトル

 [例]

--> A = zeros(4)


A =

0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0

--> B = float(randn(2))

B =

-0.9394 -0.0531
-0.0065 -0.1648
◆ 以下のように左項でも利用できます。 
--> A(2:3,2:3) = B

A =

0 0 0 0
0 -0.9394 -0.0531 0
0 -0.0065 -0.1648 0
0 0 0 0


◆ 予約をendも便利です。 
--> C = A(2:3,1:end)

C =

0 -0.9394 -0.0531 0
0 -0.0065 -0.1648 0



--> C = A(2:3,:)

C =

0 -0.9394 -0.0531 0
0 -0.0065 -0.1648 0


次元が高い場合はなお便利です。

--> D = zeros(2,2,3)

D =

(:,:,1) =

0 0
0 0

(:,:,2) =

0 0
0 0

(:,:,3) =

0 0
0 0

--> D(:,:,2) = int32(10*rand(2,2))

D =

(:,:,1) =

0 0
0 0

(:,:,2) =

5 2
9 4

(:,:,3) =

0 0
0 0


◆ ベクトルと配列を使用した下記のようか使用方法も可能です。

--> A = zeros(4)

A =

0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0

--> v = [1;2;3;4]

v =

1
2
3
4

--> A(2:3,2:3) = v

A =

0 0 0 0
0 1 3 0
0 2 4 0
0 0 0 0
※ しかしこの適用は四角のエリアへの代入だけです
(例えば斜めの要素に代入するのは不可能です)。

セル配列のインデックス表現

セル配列に適用するインデックスです。代入などはできません。

 [構文]

① variable{index_1,index_2,...,index_n}
 ※ index_i はスカラ(i=1,2,・・・)
② variable{index}
 ※ indexはベクトル

 また、端的に言えば 「()」の適用は、取り扱うセル配列のサブセットとなるセル配列を参照します。また、「{}」の適用は、セル配列の中身を参照します。例でご確認ください。

 [例]

--> A = {1, 'hello', [1:4]}

A = 

[1] ['hello'] [[1 4] int32]

--> A(1:2)

ans =

[1] ['hello']

--> A{1:2}

ans =

1 of 2:

1


2 of 2:

hello

上記の最後でansが2つになることには注意が必要である。下記
にも同様の例を示す。 

--> A = {[1,3,0],[5,2,7]}

A =

[[1 3] int32] [[1 3] int32]

--> max(A{1:end})

ans =

5 3 7


以下の例は、関数maxのまず最初におさえる必要がある。出力引数を2つ設定された場合、の関数maxは配列の中の最も大きい値とそのインデックスを返す。しかし、これは型が異なることがあるので1つの変数で受け取ることができない。しかしこれもセル配列を用いれば可能である。

--> [K{1:2}] = max(randn(1,4))
K =

[1.18247] [1]


場合によってはセル配列の要素同士を結合させることも可能です。
--> C = [A{1};A{2}]

C =

1 3 0
5 2 7


構造体のインデックス表現

構造体に適用するインデックスです。

 [構文]

variable.fieldname

 また、FreeMatはダイナミックフィールドインデックス機能によりフィールド名を宣言せずに直接設定が可能です。例(1)を参照ください。

 [例]

① 直接フィールド名を設定(ダイナミックフィールドインデックス機能)

--> clear A
--> A.color = 'blue'

A =
color: ['blue']
--> clear A
--> A(1).maxargs = [1,6,7,3]

A =
maxargs: [[1 4] int32]
--> A(2).maxargs = [5,2,9,0]

A =
Fields
maxargs
--> max(A.maxargs)

ans =

5 6 9 3
--> clear A
--> A(1).maxreturn = [];
--> A(2).maxreturn = [];
--> [A.maxreturn] = max(randn(1,4))
A =
Fields
maxreturn
--> x.red = 430;
--> x.green = 240;
--> x.blue = 53;
--> x.yello = 105

x =
red: [430]
green: [240]
blue: [53]
yello: [105]

文字列をインデックスとして利用します。

--> y = 'green'

y =

green

--> a = x.(y)

a =

240 
 

※ 複雑なインデックス表現

ここで、一つ複雑なインデックス表現の例を挙げます。 実際動作を

させてみて確認をしてみてください。 

--> Z{3}.foo(2) = pi

Z =

[] [] [[1 1] struct array]