Matlab
ひょんのことから使う羽目に。
「MatlabなんてC書けない人が使うんでしょ」て思っていた昔が懐かしい。
バージョンごとに仕様あんま変えないで欲しい。
tips
-
パス追加はメインウィンドウの「set path」から。あるいはmatlab起動した場所のpathdef.mに書いても、
set(path, )とかいうコマンド使っても良い。
-
配列には縦と横があるので注意。'で変換できます。
>> A=[1 2 3];
>> A'
ans = 1
2
3
-
切りつめ。
>> A=[1 2 3 4 5];
>> A(3:4)
ans =
3 4
-
whosで変数一覧。
-
関数定義。
a,b,cを引数に取ってd,eを返す関数fは、f.mに書かれて
function [d, e] = f(a, b, c)
...(処理)
end
となる。(returnはいらない)
作った関数は、カレントディレクトリに置くか、パスの通った場所に置くと、
[d1,e1] = f(a1, b1,c1)
みたいに呼び出せる。
-
save ファイル名 で変数保存 (作業ログ保存ではない)
save ファイル名 変数名 で変数をファイルに保存。
ファイル名が.matだったり、-asciiを付けるとgnuplotで読める
-
matlabの古いバージョンでは関数を抜けるのにbreak;が使えたのが、今はreturnしかだめ(?)
普通にbreakをreturnにき換えたら動く。
-
コマンドラインで使いたい!
MatlabのGUIはJavaで重い! 計算はCUIで十分! という奇特な人向けのtips。
しかしグラフ保存の方法が分からないので全然役立たず。分かれば追加します。
Octaveで対角化・固有値/固有ベクトル計算
A = [1.0 2.0; 3.0 4.0]
d = eig(A)
とすると、対角化されて固有値が求まる。
d, v = eig(A)
とすると、vに固有ベクトルが入ってくる。(dだけの場合よりも遅い)
Matlabとほぼ同じ事が出来るGNU Octaveで対角化してたんだけど、
計算量がどのくらいのアルゴリズムを使ってるか知りたくなったので、下のようなPythonスクリプトで
適当に問題を生成して、1辺のサイズと経過時間を調べてみた。
import random
N = 1000
print "A = [",
for i in range(N):
for j in range(N):
print random.random(),
print ";",
print "]"
print "d = eig(A)"
(実験環境: Xeon 5140 @ 2.33GHz)
Excelで近似曲線とかを出してみたら、大体O(x
4)のオーダーらしい。
あと、N<128ではどうやらアルゴリズムが違うらしい。