|
2.12.1 Mathematicaファイルの読み書き
特に,テキスト型インターフェースのMathematicaを使うとき,Mathematica式の定義や結果の書かれたファイルを読み書きする必要が生じる.これをどのように行うかは,1.11.1で一般的に述べられている.さらに,この節においても詳述されている.

ファイルの読込み
ファイルfactorsの内容を表示する.
In[1]:= !!factors
"(* Factors of x^20 - 1 *)
(-1 + x)*(1 + x)*(1 + x^2)*(1 - x + x^2 - x^3 + x^4)*
(1 + x + x^2 + x^3 + x^4)*(1 - x^2 + x^4 - x^6 + x^8)"
ファイルを読み込み,式として評価してその結果を返す.
In[2]:= <<factors
Out[2]= 
指定のファイルが見付からないときMathematicaはメッセージを表示し,$Failedを返す.
In[3]:= <<faxors

Out[3]= 
Mathematicaの読み込むファイルには任意の個数の式が書かれていてもよい.しかしそれぞれの式は新たな行に書かれていなければならない.同一の式は何行にもわたって書かれていても構わない.標準的な対話的Mathematicaセッションと同様,式は完成されると同時に評価される.しかし,対話的なセッションと異なり,ファイルに入力式を書く場合は任意の場所に空行を書いてもよく,これは無視される.
<<fileによってファイルを読むと,Mathematicaはこれを評価した最終的な結果を返す.このときの表示を抑制するには,ファイルの最後の式の末尾をセミコロンとすればよい.あるいは明示的に最後にNullと書いてもよい.
Mathematicaがファイルを読み込んでシンタックスエラーに出会うと,エラーを表示しファイルの残りの部分を無視し,$Failedを返す.シンタックスエラーがパッケージの途中で生じると,ここではBeginPackage等のコンテキスト操作関数が使われているが,Mathematicaはパッケージが読まれる前のコンテキストに復帰しようと試みる.

ファイルへの式の書出し
式をファイルtmpに書き出す.
In[4]:= Factor[x^6 - 1] >> tmp
ファイルの内容を表示する.
In[5]:= !!tmp
"(-1 + x)*(1 + x)*(1 - x + x^2)*(1 + x + x^2)"
もう 1つ式を同じファイルに書き加える.
In[6]:= Factor[x^8 - 1] >>> tmp
式は 2つとも書かれている.
In[7]:= !!tmp
"(-1 + x)*(1 + x)*(1 - x + x^2)*(1 + x + x^2)
(-1 + x)*(1 + x)*(1 + x^2)*(1 + x^4)"
expr >>> fileとすると,Mathematicaは新しい式をファイルの最後に付け加える.しかしexpr >> fileではファイルの内容を捨て,新しいexprをファイルに上書きする.
>>または >>>によってファイルに式を書くと,式は普通 Mathematicaの入力形で書かれる.したがってこの式を後で読み込んで評価することができる.しかし別のフォーマットで式を保存することもできる.それには書いた式を OutputForm等のフォーマットディレクティブに入れてやる.
計算結果の式をファイルtmpに出力形で書き込む.
In[8]:= OutputForm[ Factor[x^6 - 1] ] >> tmp
ファイルtmpに書かれた式は出力形であることを見る.
In[9]:= !!tmp
" 2 2
(-1 + x) (1 + x) (1 - x + x ) (1 + x + x )"
ファイルを使う理由の多くは,後の Mathematicaセッションで読み込んでまた使うために,Mathematicaオブジェクトの定義を保存しておくためである.>>や >>>等のオペレータで Mathematicaの式をファイルに保存することができる.また,関数 Saveを使えば,Mathematicaオブジェクトの完全な定義を,後の Mathematicaセッションで利用するのに適した形で保存できる.

定義の書出し
式を記号aに割り当てる.
In[10]:= a = 2 - x^2
Out[10]= 
aの定義を Saveでファイルに書き出す.
In[11]:= Save["afile", a]
保存したファイルに aの定義が書かれて いる.
In[12]:= !!afile
"a = 2 - x^2"
新たなオブジェクトを Mathematicaで定義するとき,しばしばその定義は以前に定義した別のオブジェクトに依存することがある.今保存しようとしている定義でオブジェクトを作り出すことができるためには,その定義だけでなく,それが利用する別の定義もともに保存しておくことが重要である.関数 Saveは定義の内容をチェックし,その定義に必要な別の定義も同時に保存する.しかし,不必要に多くの式を保存するのを避けるため,Saveは属性(Protected)をもつ記号を保存することはない.そのような記号は組み込まれていると仮定される.関連する定義も保存されるので,Saveで書き出された出力を別の Mathematicaセッションで読み込めば,保存したときと同じオブジェクトが作られるはずである.
上で定義した記号 aを含む関数fの定義.
In[13]:= f[z_] := a^2 - 2
fの完全な定義をファイルに保存.
In[14]:= Save["ffile", f]
そのファイルは fそのものの定義だけでなく,それが使う記号aの定義も含んで いる.
In[15]:= !!ffile
"f[z_] := a^2 - 2
a = 2 - x^2"
関数Saveは,Mathematicaの定義式を表示するDefinitionとFullDefinitionの出力形式を使う.場合によっては,これらの出力形式を明示的に使う方が便利なこともある.
出力形式 Definition[f]はfの定義式を表示する.
In[16]:= Definition[f]
Out[16]= 
一方 FullDefinition[f]はfの定義が参照するオブジェクトの定義も含む.
In[17]:= FullDefinition[f]
Out[17]= 
Mathematicaに読み込ませるファイルを作るとき,読んだり編集したりできるようにテキスト形式の ファイルとするのが普通である.しかし,場合によっては内容をエンコードして直接読んだり修正したりできないが,Mathematicaには読み込めるようなファイルが要求されることもある.このようなエンコードされたファイルは Mathematica関数 Encodeを使って作ることができる.

エンコードしたファイルの読み書き
式の結果をテキスト形式でファイル tmpに書き出す.
In[18]:= Factor[x^2 - 1] >> tmp
ファイルtmpをエンコードした形式でファイル tmp.xに書き出す.
In[19]:= Encode["tmp", "tmp.x"]
エンコードされたファイルの内容を見る.初めの Mathematicaコメントのみが理解できる.
In[20]:= !!tmp.x
"(*!1N!*)mcm
_QZ9tcI1cfre*Wo8:) P"
ファイルはエンコードされているが,<<を使って Mathematicaに読み込ませることができる.
In[21]:= <<tmp.x
Out[21]= 

定義を Mathematicaの内部形式で保存する方法
非常に大きな定義や複雑な定義を扱うときは,テキスト形式で保存するよりMathematicaが直接理解する内部形式で保存した方がより効率的に処理を行うことができる.内部形式で保存するにはDumpSaveを使う.
fの定義を Mathematicaの内部形式で保存する.
In[22]:= DumpSave["ffile.mx", f]
Out[22]= 
<<を使って定義を読み込むことができる.
In[23]:= <<ffile.mx
<<は Mathematicaの内部形式で書かれた定義も理解し,適切な処理を行う.注意すべきことは,この内部形式はコンピュータによって異なることである.したがって,あるコンピュータで作られた .mxファイルは別のコンピュータでも読めるとは限らない.
DumpSave["package`", ... ]の形式を使うと Mathematicaは定義を package.mx/system/package.mxの名前で保存する.ここで systemはコンピュータの型を表す.
使っているコンピュータの機種を反映する名前のファイルが作られる.
In[24]:= DumpSave["gffile`", f]
Out[24]= 
<<はそのコンピュータに合わせて適切な名前を探し出す.
In[25]:= <<gffile`

Mathematicaセッションをそのまま保存する方法
|