外れ値をデータから取り除く

外れ値(outlier)をデータから取り除く方法.xという配列にデータがいくつもあって,偏差が標準偏差の3倍以上であるものを省くには,

x = x(abs(x-mean(x)) < 3*std(x))

とすれば良い.ちなみに,偏差と標準偏差は以下のように求めている.

複素数の絶対値,実部,虚部を扱う.

Mathematicaでは特に指定しない限り,文字を複素数として取り扱う.それなので,例えば

u=a+I b;
Abs[u]

とした場合出力されるのは

(a^2+b^2)^(1/2)

でなく,

Abs[a+I b]

もし,

(a^2+b^2)^(1/2)

と出力したい場合には

  • ComplexExpand関数
  • TargetFunctionsオプション

を使用すればよい.これも実はあんまり良く理解できてないが,使用する関数を自分で指定して,複素数による数式を展開することができる.という説明になるのだが,だからと言ってなぜほしい結果になるか分からない.(追記希望)
とにかく,これらを用いて

u=a+I b;
ComplexExpand[Abs[u],TargetFunctions→{Re,Im}]

とすれば,出力は

(a^2+b^2)^(1/2)

となる.

Figureの最大化

figure関数などを使って表示させたウィンドウを最大化したいときがある.そんなときには,MATLAB CentralAlain Trostelによるmaximize figure windowsというものをダウンロードしよう.ダウンロードしたファイル(名前はmaximize.zip)を展開し,カレントディレクトリかパスの通っているディレクトリに maximize.m と windowMaximize.dll という2つのファイルをコピーすれば準備完了.

あとは,Matlab上で,

h = figure(1);
maximize(h);

というようにすれば,ウィンドウが最大化される.

ただし,最新のMatlabでは以下のような警告が出る.

警告: MEX-ファイル 'C:\research\simulation\mylib\windowMaximize.dll' の呼び出し中。
.dll の拡張子を持つ MEX-ファイルは、MATLAB の将来のバージョンで実行できません。

この警告をどうしても止めたければ, windowMaximize.dll というファイル名を windowMaximize.mexw32 に変え, maximize.m 内の "windowMaximize.dll" というところを全て "windowMaximize.mexw32" に置換してやればよい.

64bitマシンなんかを使っている人は,"mexw32" の代わりに "mexw64" という拡張子を使わなければいけないかもしれない.どの拡張子を使えばいいのかは, mexext というコマンドをMatlab上で実行してやれば分かる.

テキストデータから情報を抜き出して書き出す方法

前回のエントリーに少しだけ関連して.前回のエントリーではファイル名の一覧を取得してテキストファイルに書き出したが,そのテキストデータの各行がID_日付.拡張子のような構成だった場合にそこからIDの部分だけを抜き出す方法を.例えば

001_20100601.txt
002_20100602.txt
003_20100603.txt

から001,002,003の部分だけを抜きだす.これもMATLABからコマンドプロンプトを動かしてDOSで行う.全く知識がない中,ネットで調べながら考えたからもっとよい方法があるかも知れないけどこんな感じ.

dos('del id_list.txt & for /F "tokens=1 delims=_" %a in (filename_list.txt) do @echo %a >>id_list.txt');

はっきり言ってあんまり理解できてないが,行ってる処理は,

+書き出す先のファイルの消去(情報を後ろに足していくので消さないと実行するたびに長くなる.)
+ループの指令
+変数に入れるトークンの指定
+区切り記号の指定
+変数への代入
+ファイルの指定
+変数を標準出力にする
+テキストファイルへの書き足し

DOSコマンドのforについて調べてみると似たようなプログラム例が出てくるので参照しながら考えてみました.



=============================================================================
2010/07/09追記
=============================================================================
一番最初の実行時にid_listがない場合にエラーになるのを防ぐための対応.

dos('type nul > id_list.txt & for /F "tokens=1 delims=_" %a in (filename_list.txt) do @echo %a >>id_list.txt');

大量のテキストデータをさばく

大量のデータをいちいちloadやimportdata関数にファイル名をしてして入れていくのが面倒なので,こんなのを考えました(大したあれじゃないけど)

  1. ファイル名一覧の入ったテキストデータを作成
  2. Matlabの適当な変数にファイル名一覧を格納
  3. 一覧からファイル名を参照しながらデータを取得

1.はコマンドプロンプトを利用する.コマンドプロンプトでdirコマンドを実行するとファイルとフォルダーの一覧を取得することができる.いちいちコマンドプロンプトを開いたりするのは面倒なのでこれもMATLABから実行する.それにはdos関数を使う.細かいオプションとかは自分で調べてもらうとして,だいたいはこんな感じ.MATLABで作業しているカレントディレクトリとデータを入れているディレクトリが異なる場合を想定している./bでファイル名のみを取得,/sでパスを含めて取得.

dos('dir /b /s C:\data_directory\*.txt >filename_list.txt');

データのあるディレクトリにある.txtの拡張子のファイル一覧をフルパスを含めて取得し,Matlabで作業しているディレクトリにfilename_list.txtのファイルを作成.
2.以降はまあ分かるでしょう.注意点はファイル名を入れた変数を参照するときには出力を文字列として得なければならないのでchar関数を使うことくらいですか.ギタリストじゃないよ.

File_name=importdata('filename_list.txt');%変数File_nameにファイルネームの一覧を入れる
n1=length(File_name);%データの数

data=importdata(char(File_name(1)));%n2を決めるために一時的に
n2=length(data);%データ長
DATA=zeros(n2,2*n1)%箱の大きさを決める
for ii=1:n1;
  data=importdata(char(File_name(ii)));
  DATA(:,2*ii-1)=data(:,5);%例えば5列目と7列目を使う場合.
  DATA(:,2*ii) =data(:,7);
end;

セルの参照の切り替え

調べたらすぐ出るのだけど.セルの参照方法を切り替えるのにいつも最後まで入力してから,F2で$を入力しに戻ってたけど,長いと不便なのでなんかないかなーと思ってたらこれがヒット.

対象のセルの位置にカーソルがあるときにF4を押すと,
相対参照→絶対参照→複合参照→相対参照…
と,順に切り替わる.

複合参照は行か列のいずれかのみに$をつけるやつのこと.
地味だけど知ってると楽.

変数の消去

Mathematicaは変数を一度定義すると違うファイルを実行しても,ずっと残ったままになる.簡単な演算をする程度だとかえって不便(というか利点が分からない).というわけで,一気に変数を消すコマンド.
ClearAll["Global`*"];
以上.MATLAB
clear all;
てとこですか?