2012年11月30日金曜日

Matlabでテキストと数値の混在ファイルを読み込む


textscan を使ってファイルを読み込む。

例えば、

file.txt
 abc 1
 def 2
 ghi 3

というスペース区切り中身のファイルがあった場合、1列目を文字列、2行目を数値として読み込む。

fid = fopen('file.txt');
cell = textscan(fid, '%s %d');

とすると、cell に file.txt の中身がセル配列として読み込まれる。

つまり、2行目のテキスト( def )は、文字列に直して
char(cell{1}(2)}
というようにアクセスする。

2012年9月22日土曜日

grdimageで作った図をIllustratorで開く


追記 2012/10/18

GMT で ps 形式で図を作って、それを Illustrator で編集するときの話。

作った図の中に grdimage で作った図が入ってると、意味不明な画像が表示されてしまう。
原因は不明。。。


これを防ぐために、作った ps ファイルを ps2raster で PDF に変換してから Illustrator で開く。

ps2raster abc.ps -Tf

-Tf は PDF 形式に変換するオプション。
すると、abc.pdf が出来上がる。

ただし、この方法で作った PDF でもおかしな図が表示されることがある。
原因は不明。

ちなみに、ps ファイルから Acrobat Distiller 9 で作った PDF を Illustrator で開いても同じ現象が確認された。


以前、Illustrator 9 で開いたときは問題なかったような気もする。
ここで使ったのは Illustrator CS5。

追記 2012/10/18 ----
makecpt で no_green を指定して作った図は色がおかしくなったけど、自分で HSV で作った場合は正常に表示された。
makecpt の場合は RGB 指定になっていた。
この辺が関係ある?
-----

2012年9月14日金曜日

Javaで桁数の調整(1.4)


訂正 28 Sep. 2012

さて、Java で小数点以下の桁数やゼロ埋めなどの処理を行いたい場合。
1.5以上なら

String.format

を使って、printf 的な感じで簡単にできる。

今回はそれ以前のバージョン話。

BigDecimal を使った方法とかあるけど、NumberFormat を使う方法の紹介。

import java.text.NumberFormat;

をインポートしてから

NumberFormat nf = NumberFormat.getInstance();
// NumberFormat nf = NumberFormat.getNumberInstance() と同じ
nf.setGroupingUsed(false); //3桁ごとにコンマを挿入するのを回避
nf.setMinimumFractionDigits(2); //小数点以下2桁まで

----- 訂正 28 Sep 2012 -----
4行目を nf.setMinimumIntegerDigits(2); としてたのを
nf.setMinimumFractionDigits(2); に訂正
-----

と、NumberFormat の設定をしてから

System.out.println(nf.format(123.5));

とすると、出力は 123.50 となる。

2012年9月11日火曜日

PDFの手のひらツールの矢印


追記 2013/12/25

PDF で手のひらツールを使ってると、たまに手の上に矢印が出てくることがある。
いつも通り、文書をつかんでスクロールさせようとすると、どっかに飛んで行ってしまう。
こうなると見開きページにしてても、飛んだ先が拡大されて表示されたり、いろいろとストレスがたまる。

というわけで、この矢印を消す方法。


まずは原因から。
これは「アーティクル」と呼ばれる機能。
設定しとくと、そこをクリックしたときに別なところに飛ばせる。

何がうれしいかというと、複雑な構成の文章だったり、長い文章の場合には、次々と読み進めてくのに困らない。

でも、そんな長い文章も変なスタイルの書類も読まないし、全体像を把握したいし、自分でスクロールしたい。
こんなおせっかいな機能はいらない。


というわけで、アーティクルを削除する方法。

「表示」 -> 「ナビゲーションパネル」 -> 「アーティクル」

で、アーティクルを選択して削除すればいい。

追記 2013/12/25 -----
上記の方法はAcrobatがないとできない。
Adobe Readerで開いた場合には、"削除"ではなく"無効"にする。
その方法。

「編集」 -> 「環境設定」 -> 「一般」 -> 「アーティクルの上でカーソルを変える」(チェックを外す)
-----


2012年9月6日木曜日

TeXで引用符


今まで単純にダブルクォーテーションでくくってたけど、それだと引用のはじめと終わりが同じ記号になる。
つまり、

"abc"  -> ”abc”

って具合に。

でも、“abc”ってやりたい場合には、キーボードの@のところにある ` を左側に使うと

``abc"  -->  “abc”

となる。

ちなみに、一つにすると

`abc'   --> ‘abc’


2012年9月3日月曜日

Eclipseで自動フォーマット


Eclipse で自動的にフォーマットしてもらう場合の設定。

例えば、ループ処理してたけど、そのループを消した場合。
for(;;){} だけ消すとその中にあった処理が、余計に繰り下がったままになってしまう。


この場合は、その場所を選択して、

"右クリック" -> "Source" -> "Format"

でOK。


このフォーマットの設定は

"Window" -> "Preferences" -> "Java" -> "Code Style" -> "Formatter" -> "Edit"

に行くとできる。


例えば、一行の文字数が長い場合には適当なところで改行される。
この最大の文字数を決めるには

"Line Wrapping" -> "Maximum line width"

を変更すればいい。

このとき、設定プロフィールの名前を変更しないと怒られるかもしれない。。

2012年8月6日月曜日

MatlabのmatファイルをJavaで読み込み

なんらかの事情でMatlabで計算して、Matlabのフォーマットで出力したmatファイルの中のデータを読みたい場合。

そんなときには JMatIO というライブラリがある。BSDライセンスらしい。
例えば、以下のサイトから JMatIO_071005.zip を落としてみる。
http://sourceforge.jp/projects/sfnet_jmatio/

解凍すると lib フォルダの中に jmatio.jar があるから、eclipse で使う場合には、パッケージ名を右クリックして、
Build Path --> Add External Archives
にこの jar ファイルを指定すればいい。



さて、簡単な使い方。
まず、abc.mat というファイルがあったとして、abc.mat の中には、result という名前の行列(double型)が保存されてるとする。

MatFileReader のコンストラクタが IOException を投げる可能性があるので、try catchでくくって、

try{
  MatFileReader mfr = new MatFileReader(new File("abc.mat"));
  MLDouble array = (MLDouble)mfr.getMLArray("result");
  double[][] result = array.getArray();
}
catch(IOException ioe){
  ioe.printStackTrace();
}

とすると、double[][] result に行列データが代入される。
eclipse だと面倒見てくれるけど、

import com.jmatio.io.MatFileReader;
import com.jmatio.types.MLDouble;

をインポートしとくこと。

ちなみに、javadoc は解凍したフォルダの doc の中にあるけど、あんまり丁寧じゃない。

2012年8月3日金曜日

bashでループ

簡単だけどたまに使うから忘れる。そのメモ。

10回ループさせるとき。

for((i=0 ; i<10 ; i++))
do
  {処理}
done

bashで計算

まずは整数の計算。

a=5
b=-3
c=`expr $a + $b`

結果は2。


次は少数の場合。

a=5.6
b=-9.2
c=`echo "$a + $b" | bc`

結果は-3.6。

$a + $b のところは、"(ダブルクォート)でくくらなくてもOK。
ただし、'(シングルクォート)だとエラーが出る。シングルクォートは$を展開しないから。

2012年7月30日月曜日

Javaのジェネリクスのコンパイルエラー

よくわからないコンパイルエラーに遭遇したからそのメモ。未解決。。。 -> 追記(2012/08/22)

例えば、
ArrayList<Double> data = new ArrayList<Double>();
として、
javac -1.6 *.java
とコンパイルすると

The type ArrayList is not generic; it cannot be parameterized with arguments <Double>

と言われた。

ちなみに

$javac -version
Eclipse Java Compiler v_677_R32x, 3.2.1 release, Copyright IBM Corp 2000, 2006. All rights reserved.

バージョン的にはgenericを使えそうな気がするけど。。。
今のところ原因は不明。

普段は別なコンパイラ使ってるから問題ないけど、なんか気になる。


追記(2012/08/22)
どうやら単純に javac のバージョンが古かっただけみたい。
つまり、javac コマンドのときに -1.6 というオプションを付けていても対応しきれてない部分がある感じ。
なんとなくそんな気がする。
なぜジェネリクスだけがひっかかるのかは謎。。。

2012年7月12日木曜日

SAC で色を付けてプロット

複数の波形を読み込んで p2 とかでプロットするときには、色分けしてないと見にくい。
波形を色分けするには

p2 color on increment

としておけば、それぞれ違う色でプロットされる。
ただし、このままではデフォルトのカラーリストが読み込まれて、

Red, Green, Blue, Yellow, Cyan, Magenta, Black

となっていて、白い背景に黄色は非常に見づらい。というか見えない。

ということで、自分で色を指定する。
赤、緑、青でプロットしたい場合

p2 color on increment list red green blue

とすればいい。

ちなみに、同時に

background black
とか
skeleton blue

とかすると、背景と軸の色も変えられる。

Javaで計算時間を測る

計算時間を測るために、開始時と終了時の時間を取得して表示する

long start = System.currentTimeMilis();

  {処理}

long end = System.currentTimeMillis();
System.out.println("Calculation Time: " + (end-start)/1000. + " sec");

これは実時間を計測している。
つまり、どのくらいCPUを使ったかとかではなく、現実にかかった時間。
途中で何かのトラブルでCPUをフルに使えなかった場合なんかは、その分時間がかかる。

上の例では単純に計算にかかった時間を表示している。
夜中にバックグラウンドで計算させておいて、朝にいつ計算が終わったのかを知りたいときなんかもある。
そんなときには Date クラスを使う。
Date クラスは非推奨のメソッドがいくつかあるけど、今回の目的にはこれで十分だし、便利。

さっきと同じように、最初と最後に処理をして、計算の開始時刻と終了時刻を timestamp.txt に書き込む。

Date start = new Date();

  {処理}

Date end = new Date();
try{
  BufferedWriter bw = new BufferedWriter(new FileWriter("timestamp.txt"));
  bw.write("start: " + start);
  bw.newLine();
  bw.write("end: " + end);
  bw.flush();
  bw.close();
}
catch(IOException ioe){
  ioe.printStackTrace();
}

としておくと、timestamp.txt に開始時刻と終了時刻が
曜日 月 DD HH:MM:SS タイムゾーン YYYY
のフォーマットで書き込まれる。
タイムゾーンは、例えば、中央ヨーロッパの夏時間なら CEST と書き込まれる。




2012年7月6日金曜日

シェルスクリプトの中でSACを使う

SAC にはフィルターとか便利な関数がいろいろ入ってる。
それに、例えば、SAC ファイルのある時刻を切り出すのを複数のファイルに対して行いたい場合とか、シェルスクリプトの中から SAC を呼び出すと便利。

以下は、abc.sac の10秒から20秒まで切り出して、abc_10_20.sac として保存する場合。

#!/bin/bash

sac << EOF > /dev/null
  cut 10 20
  r abc.sac
  w abc_10_20.sac
  q
EOF

出力は邪魔なので /dev/null に投げてしまう。
注意する点は、最後に q がないと怒られる。。

2012年7月4日水曜日

ファイルの中身を後ろから表示

ファイルの最後を確認したい場合とか

tac abc.txt | more

tac がファイルの後ろから逆に表示させるコマンド。
このままだと全部表示されちゃうので、 more に投げて、一画面ごとに表示させる。

2012年7月3日火曜日

Java でデータファイルの読み込み

データを読み込むとき、昔なら StringTokenizer を使っていたけど、推奨されてないから、split を使う。

昔バージョン
try {
 BufferedReader br = new BufferedReader(new FileReader("abc.txt"));
 String line;
 while((line=br.readLine) != null){
  StringTokenizer st = new StringTokenizer(line);
  st.nextToken();
  data.add(Double.valueOf(st.nextToken()));
 }
 br.close()
}
catch(IOException ioe){
 ioe.printStackTrace();
}

abc.txt ファイルの中身の2列目を Doubleにしてから data リストに追加している。
例えば、1列目が時間で2列目がデータの時系列を読む場合とか。

で、今では
try {
 BufferedReader br = new BufferedReader(new FileReader("abc.txt"));
 String line;
 while((line=br.readLine) != null){
  String[] elements = line.split("\t");
  data.add(Double.valueOf(elements[1]));
 }
 br.close()
}
catch(IOException ioe){
 ioe.printStackTrace();
}
とすればいい。
たいして変わらないけど。

2012年6月28日木曜日

シェルスクリプト内でaliasを使う

例えば、.bashrc に
alias rm='rm -i'
と記述してあっても、
シェルスクリプト(test.bash)内で
#!/bin/bash
rm abc.txt
として
bash test.bash
としても、問答無用でファイルが削除されてしまる。

test.bash を呼び出したときには .bashrc が呼ばれないのが原因らしい。

そこで、.bashrc を読んでaliasを有効にするために
#!/bin/bash
shopt -s expand_aliases
source ~/.bashrc
rm abc.txt
とすると、ちゃんとabc.txtを削除するときに確認メッセージが出る。

2012年6月27日水曜日

SACとアスキーの変換

追記 2015/06/10

SACとはIRISが配布してる地震波の解析をするためのツール。
http://www.iris.edu/software/sac/manual.html

簡単にプロットしたいときとかフィルターとか、地震波に限らずいろいろ便利だから、アスキーファイルとの変換について。

SAC ファイルのフォーマットは上のページで公開されてるから、それにしたがって単純にファイルの読み書きをするファイルを java で作ってみた。

その jar ファイル。
SacTool.jar

参考までに使い方は
.bashrc とかに

SACTOOL={ダウンロードしたSacTool.jarのフルパス}
alias sac2ascii='java -cp $SACTOOL SacToAscii'
alias ascii2sac='java -cp $SACTOOL AsciiToSac'

と記述する。
source .bashrc
と設定を有効にしたのちに、SAC からアスキーへは
sac2ascii {SAC ファイル名} {変換後のアスキーファイル名}
アスキーから SACへは
ascii2sac {アスキーファイル名} {変換後の SAC ファイル名}
とする。

ちなみに、SAC からアスキーに変換するとき3つ目の引数に整数値を指定すると、その数に1つの割合でしか値を変換しないようにする。
これは、GMT とかでプロットするためだけに SAC からアスキーに変換したいけど、重くなるから間引いてプロットしたい場合に役立つ。
ただし、デシメーションフィルタはかけずにそのまま間引いてるので、処理する際には注意が必要。。

sac2ascii {SAC ファイル名} {変換後のアスキーファイル名} {間引きの間隔}

例えば間引きの間隔を 4 にすると、データサイズは4分の1になる。

追記 2015/06/10 ----
GMT の psxy コマンドはバイナリファイルが読めることを知ったので、
sac からpsxy用バイナリに変換するプログラムを追加した。
単精度で書き出しているので、psxy を使う際に "-biS" オプションを付ける。

現在、使用可能なクラスは

・アスキー → sac
 AsciiToSac <asciiFileName> <sacFileName>

・KiK-netアスキー → sac
 KiknetToSac <KiknetFileName> <SacFileName>

・sac → アスキー
 SacToAscii <sacFileName> <asciiFileName> (sampleStep)

・sac → アスキー(0位相バタワース型バンドパスフィルタをかける)
 SacToAsciiBP <sacFileName> <f1> <f2> <order> <asciiFileName> (sampleStep)

・sac → アスキー(バンドパスフィルタ適用後、2乗エンベロープにする)
 SacToAsciiEnv <sacFileName> <f1> <f2> <order> <asciiFileName> (sampleStep)

・sac → バイナリ(単精度)
 SacToBin <sacFileName> <binaryFileName> (sampleStep)

・sac → バイナリ(0位相バタワース型バンドパスフィルタをかける)
 SacToBinBP <sacFileName> <f1> <f2> <order> <binaryFileName> (sampleStep)

・sac → バイナリ(バンドパスフィルタ適用後、2乗エンベロープにする)
 SacToBinEnv <sacFileName> <f1> <f2> <order> <binaryFileName> (sampleStep)

(sampleStep) はオプション(省略は 1 と等価)。

----

2012年6月26日火曜日

GMTでプロットするときにデータを区切る

例えば1つ目のデータ(data1.txt)が
1 5
2 3
3 8
2つ目のデータ(data2.txt)が
1 9
2 6
3 1
となっている場合を考える。
このとき、
psxy data1.txt -JX4/4 -R0/4/0/10 -Ba2f1::nSeW -W1p/0/0/0 -P -K > out.ps
psxy data2.txt -J -R -W1p/0/0/0t6_4:0 -P -O >> out.ps
とすると


となる。

この2つのデータを1つにまとめたファイル(data.txt)をプロットしたい場合には
1 5
2 3
3 8
>
1 9
2 6
3 1
のフォーマットでデータファイルを作成し、psxy のオプションに -M を付ける。
ちなみに、この区切りの > はデフォルトらしいけど、変え方は知らない。。

psxy data.txt -JX4/4 -R0/4/0/10 -Ba2f1::nSeW -W1p/0/0/0 -M -P > out.ps
とすると、さっきと同じような図ができる。線の種類は変えられないみたい。


この区切りを指定しなかった場合には、すべての点が一筆書きでつながって一本の線になってしまう。

2012年6月22日金曜日

Pythonの算術演算

後で調べるために残しておくメモ。。


0 から π までの要素数 n 配列を作りたい場合
array = numpy.arange(n)*numpy.pi/float(n)
とする。



最初に結果がおかしいと思っていたのは
array = numpy.arange(n)
array *= (numpy.pi/float(n))
これだと array の中身は整数値のみ。つまり0, 1, 2, 3のみ。
なぜだろう。。

2012年6月21日木曜日

rsyncでディレクトリのコピー

基本的な構文は
rsync -a {コピー元} {コピー先}
-a オプションはディレクトリを再帰的にコピーしたり、ファイルの情報を保持したままコピーするからとりあえず付けとく。



具体的には ディレクトリ /abc/def/ に file1, file2, file3 というファイルがあって、それを /uvw/xyz/ にコピーする場合
rsync -a /abc/def/ /uvw/xyz/
だと
uvw---xyz---file1
               |-file2
               |-file3
となる。



コピー元の最後に / を付けないで
rsync -a /abc/def /uvw/xyz/
とすると
uvw---xyz---def---file1
                      |-file2
                      |-file3
となり、def ディレクトリもコピーされる。

ちなみに、コピー先の / はあってもなくても同じ。

2012年6月20日水曜日

bashで複数行のコメントアウト

一行だけのときは
#{処理}
とすればいい。

複数行の時は
: << '#COMMENT_OUT'
  {処理}
#COMMENT_OUT
とすればいい。

bashでファイルを一行ずつ読み込む

while read line; do
  echo $line
done < {ファイル名}

読み込んだラインを分割したい場合には
var=`echo $line | cut -d ',' -f 2`
これは、区切り文字が , (カンマ)で、2つ目の文字列を var に入れるとき。

awkを使って
awk '{print $2}' {ファイル名}
でも同じかな。

2012年6月19日火曜日

GMTでの日時の取り扱い

追記 2013/02/18

"gmtdefaults"の中身をチェックする。

INPUT_CLOCK_FORMAT = hh:mm:ss
INPUT_DATE_FORMAT = yyy-mm-dd

となっている場合、ファイルの時間軸は

yyyy-mm-ddThh:mm:ss


と指定する。

プロットするときの R オプションは

R2001-01-01T00:00:00/2010-12-31T23:59:59/{min}/{max}

と指定する。{min}と{max}は表示するデータ値の最小値と最大値。

B オプションは、1年ごとに数字、1か月ごとに目印を入れる場合

Ba1Yf1o

とする。大文字のYだと2004みたく4桁表示。小文字だと04になる。
o は月を表す。

B オプションの詳細は
http://gmt.shin-gen.jp/GMT4.1.4/psbasemap.html


追記 2013/02/18 -----
通年日を指定する場合には jjj を使う。
つまり、

yyyy-jjj

といった感じ。
-----