リストの全要素を単一のオブジェクトとして生成する方法
モデル課題
(1)4点A(1,1),B(8,1),C(8,8),D(1,8)に対して、四角形ABCDの内部および周に含まれるすべての格子点を、リストオブジェクトとして作成しなさい。
(2)(1)で作成したリストオブジェクトの1番目の要素である点を、単一の点オブジェクトとして生成しなさい。点の名前は「P1」としなさい。
(3)(1)で作成したリストオブジェクトの要素であるすべての点を、単一の点オブジェクトとして生成しなさい。点の名前は「P1」、「P2」、...、「P64」としなさい。
解答例
(1)
以下のコマンドを入力バーに入力することで作成できます。
Flatten[Sequence[Sequence[(s, t), s, 1, 8], t, 1, 8]]
(2)
(1)で作成したリストオブジェクトの名前が、list1であるとします。
目的のオブジェクトは、以下のコマンドを入力バーに入力することで作成できます。
P1 = Element[list1,1]
(3)
目的のオブジェクトは、以下のコマンドを入力バーに入力することで作成できます。
Execute[Sequence["P"+t+"=Element[list1,"+t+"]",t,1,Length[list1]]]
実行したいテキスト"Pt=Element[list1,t]"のリストを、tが1からLength[list1]になるまで作成し、そのリストを実行するコマンド「Execute」を用いて、点を作成しています。
解説
Execute[Sequence["<共通名>"+t+"=Element[<リスト>,"+t+"]",t,1,Length[<リスト>]]]
上記コマンドは、リストの全要素を単一のオブジェクトとして返し、各オブジェクトの名前を「共通名」+通し番号とするための公式として利用できます。
例えば、上図の9つの正方形のリストは、
list1 = Flatten[Sequence[Sequence[polygon[(s,t),(s,t+1),(s+1,t+1),(s+1,t)],s,0,2],t,0,2]]
として作成することができますが、上述の公式にあてはめて、
Execute[Sequence["poly"+t+"=Element[list1,"+t+"]",t,1,Length[list1]]]
を実行することによって、リストの全要素の正方形を、単一のオブジェクト(poly1〜poly9)として作成することができます。
リストの要素を単一のオブジェクトとして生成することのメリット
リストオブジェクトは、それ自身で単一のオブジェクトであり、要素ごとに色やハンドラの設定を分けることができません。
上記の正方形の例で言うと、list1の色を変えると、list1の全要素の色がその色に変わるだけで、要素ごとに色を分けることは、(list1だけでは)できません。
しかし、リストの要素を単一のオブジェクトとして生成すれば、それぞれのオブジェクトに個別の設定を施すことができます。