Matlabが吐くepsをdvipdfmxで処理すると切れる

タイトルのとおりの現象が発生しました。最近諸事情によりMatlabを本格的に使い出したのですが、文章を書くのはやはりTeXなので、Matlabで作成した図はeps形式で保存し取り込んでいます。しかし、このMatlabが吐く図というのが曲者で、platexで処理をかけたdviでは図がしっかり読めるのですが、dvipdfmxでpdfにするとなぜが図の左側が欠けてしまうという現象がおきました。

図が出力できないMatlabなんぞ使い物にならないので、原因ならびに打開策をネットで調べてみました。最も簡単な打開策としては、イラストレータの形式であるaiでMatlabから図を出力し、イラストレータで図形を調整後、epsに変換するというものです。イラストレータからのepsは今までTeXならびにdvipdfmxを利用してきて取りこぼしたことがないので確実な方法であると思います。
しかしながら、今回はMatlabから保存したのはepsファイルのみ(.figやワークスペースを保管していなかったorz)で、もう一度グラフを出力しなおすのは少々大変という事情がありました。そこでなんとかして出力済みのepsのみを利用して問題解決を図りたいと考えました。

さらに色々と調べてみた結果、海外の掲示板で『Inclusion of large eps files with dvipdfm』というのがひっかかりました。
どうやら原因はepsのファイル内に記述された『ここからここまでが図形が入っている領域ですよ』というのを示したBoundingBoxの値の一部が負値をとっていることに原因があるようです。dvipdfmxは非負値の場合のみしか正しくepsを処理できないようで、この問題を修正するためにはepstopdfというコマンドを利用して、epsをpdfに変換してincludegraphicsで取り込めば解決すると書いてありました。

実際にepstopdfを使う方法を試してみると、うまく図が表示されるようになりました。しかしpdfをincludegraphicsで取り込む際にはbbオプション、あるいはebbコマンドを利用してBoundingBoxを指定してあげる必要があります。これはepsファイルに比べて取り回しがしにくくなりますので、ここではさらにxpdfのpdftopsコマンドを利用して、変換したpdfをさらにepsに戻してみました。この戻したファイルでも確認したところ図が切れずに表示されることを確認しました。

コマンドで表すと以下の作業をすることで、Matlab epsのBoundingBoxを正しい値に修正することができました。

for f in `find . -name "*.eps"`
do
    epstopdf --outfile=$f.pdf $f
    pdftops -eps $f.pdf $f.eps
    mv $f.eps $f
    rm $f.pdf
done

これでMatlabを安心して使うことができそうです。

July 02, 2007 23:59 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク

コメント

アメリカはMatlabが超ポピュラーで、コンピュータ・サイエンスでもない限り、CやJAVAは疎まれてます。そんなわけで俺も毎日Matlabなんだけど、怪しさ満載だよね、このソフト。特に、Simulinkのモデルをクロス・コンパイルして、組み込みPCやマイコンを動かす"xPC"というのがあるんだけど、これが怪しいこと限りなし。デバックしようにも、どこがどういう仕組みで動いているのか全くわからんから、デバッグのしようがない。

Posted by: おの : July 3, 2007 04:00 AM

>おの
Matlab本当に細かいところがあやしいね。中身を調べようにも色々とブラックボックスになっているので、M$のWindows APIを調べているときと同じ気分になれました。これは入信する必要がありそうですorz
あと大学のうちからMatlab漬けにしておいて、その後も搾取しようという企業戦略なんだろうね。ちなみに僕のデスクトップは向こうの学生が見たら吐き気がするであろう状況(黒い窓がいっぱい!!)になっているので大丈夫です(笑)

Posted by: fenrir : July 3, 2007 12:20 PM

>あと大学のうちからMatlab漬けにしておいて、その後も搾取しようという企業戦略なんだろうね。

あーこれはその通りかもしれない。マックが子供セットのおもちゃに釣られて、不味いハンバーガーの味を覚えるような。

ブラックボックスは良し悪しだね。枠の範囲内に収まっていれば、これほど便利なものはない。制御の授業の宿題にMatlabは不可欠。一方で、すこし枠から出ようと思うと、これほど不便なものはない、って感じ。

あと、逆行列とか、特異値分解とか、決まりきった演算は、下手に自分で書くよりも、Matlabのアルゴリズムの方が断然高速。俺の書き方が悪いのか?

でも、とりあえず行列のインデックスが1から始まるのはやめてほしいよね(笑

Posted by: おの : July 4, 2007 12:53 AM

>おの
Matlabは実はLAPACK(FORTRANで書かれていた)という有名な線形代数ライブラリのフロントエンドとして機能しているので、ある程度の速度が確保されてます。1からインデックスはじまるのは多分Fortranの影響で、できればやめて欲しいね…、速度についてもfor文の遅いこと…
自分でプログラム書く場合も、フルスクラッチじゃなくて線形代数の部分はboost::uBLASなんかを使えばLAPACK以上の性能がだせるかもしれないです。どっちにしてもソース読むとET化(コンパイル時展開技術)されていて人間が読めるものではないですが(笑)

Posted by: fenrir : July 4, 2007 05:30 AM

すごい時間に起きてるな。これは朝?夜?

よくJAVAのダイアログが出てくるけど、MATLABはJAVAの上で動いてるの?ならば遅いのもうなずける・・・

Posted by: おの : July 4, 2007 08:05 AM

>おの
朝だよー。最近不規則生活が続いています、暑いんだもん。
そうそうMatlabのGUIは多分ほとんどJavaでできているよ。

Posted by: fenrir : July 8, 2007 02:26 AM

非常に助かる情報でした.ありがとうございました.

Posted by: ツノの人 : February 17, 2008 03:50 AM

>ツノの人さん
fenrirです。お役に立てたようで何よりです。

Posted by: fenrir : February 17, 2008 11:57 PM

コメントする