トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

備忘録/Matlab の変更点

Top / 備忘録 / Matlab

[[Labview]]
*Matlab [#r17c82ef]
#contents
**コマンドウィンドの消去 [#t9897b95]
 clear
は、ワークスペースの消去
 clc
はコマンドウィンドの消去。
ちなみに履歴は消去されない。

**for文とif文を極力使わない [#kea9cd66]
matlaは行列計算は得意だがfor文の実行速度は遅いみたい。
できるだけ使わないようにする。
例えば以下のようなforとifが混ざったようなコード
 for i=1:10
    if i>5
       z(i)=i^2;
    else
       z(i)=i^(-2);
    end
 end
これは以下のようにする。
 i=1:10;
 z=(i>5).*i.^2+(i<=5).*i.^(-2);
これで高速化andコードがすっきり。
ただし、NaNには注意。

**行列の抜き出し [#yba8e2e7]
 A=1:0.1:100;
 B=1:10:100;
 C=A(B);
とすると、
 C=[1 2 3 4 5 6 7 8 9 10]
となる。行列のに抜き出しに便利。
 C=A(1:10:100);
でも同じ。

**NaNの置換 [#c2201a3d]
NaNに限らず特定の値を置換するのに使える。
まず、NaNを検出する。
NaNでなければ配列Aから検出したい数字をaとすると
 A==a;
でよい。
NaNの場合は
 A==NaN;
とできず
 isnan(A);
とする。
あとは、
 A(isnan(A))=0;
とすると、配列AのNaNを0に置換する。

**グリッドの生成 [#q58e2b69]
入力が二次元以上での関数を作成したい場合はグリッドの生成が必要になる。
例えば、入力が二次元で原点からの距離を表現したい場合。
 x=-10:10;
 y=-10:10;
 r=(x.*2+y.*2)^2
としてもだめで、x,yそれぞれy,x軸方向に値が同じな二次元の配列を作らなければならない。
 [x y]=meshgrid(-10:10,-10:10);
 r=(x.^2+y.^2)^0.5;
となる。ちなみに三次元以上はndgridを使う。

**積分をしたい [#w00fc4c3]
例としてf(x)=x^2を0から1まで積分します。
 f=@(x) x.*2;
と、関数x^2を宣言します。
そして、台形公式(quad)を用いる関数を使う。
 int_f=quad(f,0,1);
もしくはシンプソンの公式(quadl)を用いる関数を使う。
 int_f=quadl(f,0,1,);
二重積分をしたい場合はdblquad、三重積分をしたい場合はtriplequadを使います。

**三次元のグラフで等値面表示をしたい [#p751152b]
三次元グリッド上の値を表示したい場合に等値面表示をしたいことがあります。
matlabで可能なのですが、説明が大変なので以下のURLを参照。
筑波大学社会工学類・MATLABヘルプデスク

http://infoshako.sk.tsukuba.ac.jp/InfoRes/jdoc/MATLAB5/jhelp/techdoc/ref/isocaps.html

**グラフの目盛り等を調整したい [#mbde644d]
グラフの表示法の調整に関しては
 set(gca)
と入力してみればどんな種類があるか分かる。
例えば。目盛りをTimes New Romanの20 ptにしたければ、
 set(gca,'FontSize',20);
 set(gca,'FontName','Times New Roman');
とすればよい。
さらに、x,y,z軸の目盛の調整は以下のように行う。
これは、配列が1から始まっているので0に戻している。
 set(gca,'XTick',[1 21 41 61 81],'XTickLabel',[0 2 4 6 8])
 set(gca,'YTick',[1 21 41 61 81],'YTickLabel',[0 2 4 6 8])
 set(gca,'ZTick',[1 51 101],'ZTickLabel',[0 5 10])

**waitを入れたい [#o15ebba3]
waitやsleepじゃなくてpauseを使う。
 pause(10);
だと10秒wait。
 pause
だと、入力待ちの状態になる。

**三次元以上の配列は遅い [#x9e46797]
三次元以上の配列は高速化の処理がされない。
二次元の配列に抑えた方がよい。

**実行速度の検証ツール [#z3f481f1]
tic、tocを使うよりもProfileを使った方がよい。
Editorのツール→プロファイラを開くから。
これを使うと、行ごとの実行回数と計算時間が分るのでボトルネックが判明し対処しやすい。

**より細かいサンプルで再現したい [#va5e9ee6]
データをサンプリング定理を満たしてサンプリングした場合、原理上は元の連続信号が再現できる。
matlabではFFTにより補間(?)というか、より細かいサンプルでデータを再現する関数が存在する。
 Y = INTERPFT(X,N) 
で、X のフーリエ変換で補間によって得られる長さ N のベクトル Y を出力する。

**ゼロ割やINF、NaNが出たときに計算を止めたい [#pac5d4b1]
dbstopをつかう。
 dbstop if naninf
で、ゼロ割の際にデバッグモードに移行。

**linuxではGUIはいらない [#wb650942]
 matlab -nojvm
で実行すれば、GUIが起動せず、使用メモリも減る。

**imagescで原点を左下にする [#l83610bc]
デフォルトでは左上になっているので、

 set(gca,'YDir','normal');

をimagescの後に入れると原点が左下になる。

**最小値 or 最大値のインデックスを得たい [#oc4b4b70]
findを使う。Aの最小値のインデックス(min_x,min_y)を得るためには、
 [min_x,min_y]=find(A=min(min(A)));
とする。最大値の場合はminをmaxに変える。

**二次元配列からの直線or曲線で抜き出し [#o9cbbfca]
二次元座標上の値である二次元配列があり、平面上の直線or曲線上の値を抜き出すことを考える。
例として座標グリッドを
 [x,y]=meshgrid(min_x:step_x:max_x,min_y:step_y:max_y);
とし、二次元配列をAとするy=-1x+10上の値を抜き出し一次元配列Bを得たいなら
 B=A(y==(-1*x+10));
とする。曲線にも使える。

**計算終了をメールで教えて欲しい [#n0c2c3f6]
計算時間がかかる場合は、どこまで進んだかいちいち画面を見るのはめんどくさい。
そこで、計算が終了したらメールを送信で知らせる。

[[ MATLABからメールを送信する:http://sach1o.blog80.fc2.com/blog-entry-97.html]](初心者によるMATLABメモ)

を参考に設定をしsendmailコマンドを使う。
計算に数時間とか数日とかかかる人にはお勧め。