この記事のまとめ
-
自分あまり詳しくない人のためのまとめ - 計算したデータを文字列(テキストファイル)に保存して再利用できるようにする
- 取得したデータの取り扱い
- その他(細々としたメモ)
Mathematicaは記法や用語が一般的なプログラミング言語と異なり、機能はあるのにヘルプを検索してもなかなか見つからなくて大変なので書き残しておく。
データの保存と読み出し
データを保存する
SetDirectory[NotebookDirectory[]]; (* これをやっておくとノートがある場所からの相対パスで記述できる *)
data = List[hogehoge]; (* 今回はリスト・行列形式のデータを作成したとする *)
Export["data.txt",data];
ファイル名やディレクトリパスに文字色を設定すると「存在しません」となって保存できないので注意。
単純な数値リストだけでなく、スタイルを指定したグラフデータ(RegionPlotなど)も保存できるので、計算に時間がかかるものは書き出し→読み出し作業を行う方が再現する際に楽になる。(グラフデータの場合も下のReadListで読み出せる。)
動的なファイル名をつける
filepath = TemplateApply["data/````_``.txt", {"foo",1,0.2*10}]
(* filepath = "data/foo1_2..txt" *)
Export[filepath,data];
ファイル名にドットが2つ並ぶのは、TemplateApply内で拡張子として記述した.txt
のドットと、0.2を10倍した時の近似値を表すドット(2.
)のせい。
参考→https://www.wolfram.com/language/fast-introduction-for-programmers/ja/strings/
データを取得する
list = ReadList["data.txt"]; (* 既にリスト・行列形式の場合 *)
datapoints = Length[list] (* 要素数を取得しておくとプログラミングで便利 *)
リスト操作
n個の空要素(リスト)を持つリストの作成
list = Table[{}, {n, 1, 10}]; (* この例では10個 *)
list = {{}, {}, {}, {}, {}, {}, {}, {}, {}, {}}
となる
データを表示する
list = { (* 例のために明示したが上記の取得したものをそのまま使える *)
{{a,b},{c,d}} (* {{a,b},c}のように要素数が違っても良い *)
{{A,B},{C,D}}
};
list[[1]] (* {{a,b},{c,d}} *)
list[[1,1]] (* {a,b} *)
list[[1,1]][[1]] (* a, list[[1,1,1]]でも良い *)
データを絞り込む
newlist = {};
shiborikomi[i_] := Module[{x}, (* この関数では内部変数は必要ない *)
If[list[[i, 1]][[1]] == 1, (* 条件 *)
AppendTo[newlist, list[[i, 2]]]; (* 処理 *)
];
];
For[i = 1, i <= datapoints, i++, shiborikomi[i]]
ListPlot[newlist]
本当はcsvとかにも保存できるし、ImportとかToExpressionという関数もあるので、より効率を求めるならドキュメントを読もう。
プログラミングTIPS
PHPなどと比較的近い。
- 返り値のある関数を作りたい場合はModuleの中にReturn
ちなみに何でも返せるようだ。引数(hoge_
)に他の関数からの返り値(なんでも良い)を取ることもできる。
getSolution[hoge_] := Module[{val},
solution = (* 処理 *);
Return[solution]
]
-
Break[]
やContinue[]
もある。[]
を忘れないようにする -
関数の引数は複数定義しても、Module内で使っていなければ省略してもエラーなく動く。重い処理を一時的に切って回したい時に便利。
-
Share[]
を適宜挟むことでメモリを解放できる -
代入を
=
ではなく:=
にしておくと、後から変数の値を変更しても、関数を定義し直さなくても良い -
PHPのin_arrayに相当するのはMemberQ
-
関数内の変数とグローバル変数の名前が同じだと思わぬバグを生じるので注意する
-
Do[]
とSwitch[]
を組み合わせると、連動して変更されるパラメータ(特に観測値)を代入するのに都合が良い(例ではi=gen
だが、切り替えられれば何でも良い)
Do[
Switch[i,
0, gen = 0; mass = 0;,
1, gen = 1; mass = 0.05;,
2, gen = 2; mass = 0.05;,
3, gen = 3; mass = 0.1;
];
, {i, 0, 3}]