2015年2月20日金曜日

octaveでバイナリーデータを3d-meshで可視化してみる

octave でバイナリーデータを可視化するメモ。

# 1. file-a なるファイルをバイナリー・読み込みモードで開きハンドルをfaに入れる
fa = fopen('file-a', 'r', 'b')
# 2. バイナリーデータ本体位置までシーク
fseek(fa, 32)
# 3. za へ int32 型の 17*17 サイズの行列としてマシンネイティブのエンディアンでロード
za = fread(fa, [17,17], 'int32', 0, 'native')
# 4. za の 0 未満の要素を nan(not a number) に変換
za( find( za < 0 ) ) = nan
# 5. za の要素を 1000 で除算
za /= 1000
# 6. xa を za の列インデックスで生成
xa = 1:columns(za)
# 7. ya を za の行インデックスで生成
ya = 1:rows(za)
# 8. x:xa, y:ya, z:za でメッシュ可視化
mesh(xa, ya, za)

はまりどころ:

  • (3) の fread はデフォルトでビッグエンディアンでロードするので最後のパラメーターまでちまちま与えないと今時の多くの一般的なPCが対象のデータ場合には値が壊れる。

  • (4) は function o = f( i ) if ( i < 0 ) o = 0 else o = i end end を定義してから za = f(za) とかやったらいいのかと思ったけど、そうしたら値の判定がまともに動かなかったり結果がスカラーになったりと、わけわからんので別の方法を探してみたところ、findを使えばよいという事に落ち着いた。

tips:

  • この例ではmeshで可視化する際に除外したいデータを NaN にする事でプロットにそもそも値が出ないようにしてみた。

enter image description here

enter image description here

参考: https://www.gnu.org/software/octave/doc/interpreter/Concept-Index.html#Concept-Index

0 件のコメント:

コメントを投稿