メモ
- 範囲指定の演算には()が必要
- テンソルにすると,max, meanなどが楽.作り方は,forで回してしまったほうが良い
- 表示が処理に対して追いついていない場合->drawnowコマンド
目次
下位ページ
参考ページ
- http://www.sc.ctrl.titech.ac.jp/~saitou/matlab.html#struct
- matlabでObject指向
疑問
cellの中身に直接カッコオペレータ
- retCellFunc(args){1,1}などはできない?
structure
- st([1 3 5]).member_mat(3, 5)
Matlab文法
structure
- 基本的にはmap
- 何の事前定義なしにa.c=3と書いて良い
- a.c.e=4もOK
- Structure with Multiple Fieldsのようにすると,struct arrayをつくることが出来る.s(1)のようにする.非常にやばい感じの文法
古いクラスの書き方
- 古いクラスの書き方
- @CookingフォルダにCooking.m,display.mなどを突っ込むとそれがコンストラクタ,メンバ関数になる.
- メンバ関数にselfを毎回引数に取らなければならずかなりクソ?
新しいクラスの書き方
- 新しいクラスの書き方(このサンプルのままだとset accessができない気がする)
- 実体クラスをモジュール,ポインタクラスをインスタンスと呼び,区別される
- ゲッタ,セッタを実装することができる.
引数が全て文字列の時だけのカッコが省略可能
- 引数の全てが文字列の場合だけ引数のカッコが省略可能
- 以下の二つが同値
- foo a b c
- foo('a','b','c')
viで変更した時に待たないと利用可能にならない
- rehashで解決.
行列のfor
- for v=Aと表現すると,vはA(:, i)の順番で呼ばれる.
cell配列
- cell配列=全ての要素がcellの配列
- [{1} {2}; {3} {4}]など
- 上記の省略形として{1 2; 3 4}と書ける
- {}, ()の使い分けなど.
- http://bun6memo.blogspot.jp/2013/06/matlab.html
cell配列への代入
- 長さを明示した部分配列にセル配列を突っ込む感じ.
function [ret] = cut_real_trials(realdm)
ret = {};
index = 1;
for a = realdm'
c = a{3};
for i = 1:size(c, 2)-1
first = c(i);
last = c(i + 1) - 1;
ret(index, 1:3) = {a{1}(first:last), a{2}, first:last};
end
index = index + 1;
end
end
cell配列のforの参照はcell
- cellの行列なので当たり前
- {[1],[2]}をforで回すと,{[1]}が各要素として代入される.
a = {[1],[2]};
for elem = a
print(elem{1}); % elemではまだcell
end
cell文字列を普通の文字列にする
s = strjoin(s_cell);
標準関数
loadとsave
whos -file durer.mat %matファイルの変数名を見る
save('150911.mat', 'var1', 'var2', 'var3', '-v7.3'); %特定の変数だけセーブ
load('141110.mat', 'pf2'); % 特定の変数だけロード
mat, cell配列へのバッチ処理
cellfind
- c.f. matに使うfind
- 数字
C = {1,5,3,4,2,3,4,5,2,1};
index = find([C{:}] == 5);
- 文字
cell_array={1,eye(2),true,'foo',10};
string='foo'
logical_cells = cellfun(cellfind('foo'),cell_array)
logical_cells =
[0,0,0,1,0]
arrayfun, cellfun
- aの各行のnormを取る.
d = arrayfun(@(idx) norm(a(idx,:)-m), 1:size(a,1))
- cell文字列配列の全てに検索.
cellfun(@findstr, dm1(:, 2), cellstr(repmat('post', size(dm1, 1), 1)), 'UniformOutput', false)
cellfun(@(x, y) findstr(x, y), dm1(:, 2), cellstr(repmat('post', size(dm1, 1), 1)), 'UniformOutput', false)
- @は関数オブジェクトにするくらいの気持ち.ラムダといったほうが近い?
- Uniformなんとかって言われたら,戻り値は一個にしてくれ,という意味.
- 引数も全てcellにしなければならない.
PCA
-
変数の意味
- column(:,i)がPCiの軸に相当
- score(n,:)がn個目のデータのPCベクトルによる成分に相当
-
PCAをかけた軸が何を表しているか?
[coeff, score, c, d, expected, mu] = pca(tac);
% 第i主成分が元のデータでどのようなデータになっているか?
% tac = score * coeff' + repmat(mu, size(score, 1), 1)
% tac(i, :) = score(i, :) * coeff' + mu
% PCAを張ったデータ以外のデータdataの第i主成分は何か?
% s = (tac_now - repmat(mu, size(tac_now, 1), 1)) * inv(coeff');
% s(i, :) = (tac_now(i, :) - mu) * inv(coeff');
PCA Expectedの見方
- plot(cumsum(expected), '+');
移動平均
- filter(デジタルフィルタ)が使える.
- 分子部分だけ使ってz変換として利用.
r = [0 1 2 3 4];
A=[-1 3];
f=filter(A, 1, r)
f =
0 -1 1 3 5
線形近似(擬似逆行列演算)
y = X * a + e
- モデルに対して,
a = X \ y
e = y - X * a
% Enter t and y as columnwise vectors
t = [0 0.3 0.8 1.1 1.6 2.3]';
y = [0.6 0.67 1.01 1.35 1.47 1.25]';
% Form the design matrix
X = [ones(size(t)) exp(-t) t.*exp(-t)];
% Calculate model coefficients and residental
a = X\y
r = y-X*a
分割plot
- plotを分割できる.
- subplot(w, h, index)を宣言してからplot, scatterをすれば分割ができる.
- title, xlabel, ylabelなどはplotのあと.
sprintf
- c言語のsprintfとの差分は,"が'となっていることのみ.
多次元データの見方
- imagesc
- 全部生で見られる
- pca
- 次元を落とす
分布の見方
- mean, var, hist
- hist
[nelements,xcenters] = hist(data)
bar(xcenters,nelements)
快適なプログラミングのために
matlabプログラムの高速化ハック
http://www.aclab.esys.tsukuba.ac.jp/~ohbuchi/matlab.pdf http://myenigma.hatenablog.com/entry/20121231/1357024090#4ループではなく行列演算を使用する
間接参照
- ポインタを使いたい時用
- 超すごい
メモリの節約
- きちんと使わなくなった変数はsaveして,必要になったらloadするように.
不必要なfind
- A(A<0.5) = 0でよい.findはいらない.
Shuffle
- データのシャッフル
- Period Shuffle Surrogate,実験順序生成のために.
data = data_num(randperm(length(data_num)));
Color Bar
imagescのcolorbarを変えたい時に使う. colormap(-sortrows(-gray))
figを開く・epsに変換する
- figを開く
openfig('input.fig');
- epsに変換
rgb2cm
openfig('input.fig', 'new', 'invisible');
print(gcf,'-depsc','-painters','output.eps')
包絡線
http://jp.mathworks.com/matlabcentral/answers/103700-
Matlab環境
初期設定について
- matlab/project1を作る.
- project1/load_env.mにpathの設定などを入れる
- project1/load_project1.mにデータのload関数を入れる.
ワークスペースの保存と再開
- 作業の終わりにはsave('yyyymmdd.mat','-v7.3');
- 作業の始めにload('yyyymmdd.mat, '-v7.3');
マルチプロセスによる並列化
- マルチプロセスでmatlabの実行
screen
matlab -nodisplay
[command]
[ctr-ad] # detach
- 戻って見たい場合は,
screen -ls
screen -r
vim配列のmatlab
- 無理らしい
- いちおう,CUIで起動中に!vi hoge.mとして,matlab内でviを立ち上げることでできなくない.
matlabのオプション
- http://d.hatena.ne.jp/ruicc/20091216/1260981595 このページには,描画すらもCUIでできるようにする方法が書いてある.
- '-r' 初回コマンドで指定可能.hoge.mを作って,-r hogeとすれば,あたかもhogeを実行するコマンドになる.
- '-nodisplay' GUIの表示非表示
Exit Blocker
非保存のファイルを1つ残すべき
Matlab Coder
- Matlab->Cのコンパイル
トラブルシューティング
カラーバー付きscatter plotなどがベクタ出力できない
- カラーバーが壊れていて,唯一ベクタ出力できるpainterレンダリングが使えなくなっているらしい.
- カラーバーを直すスクリプト:
- 参考(これだけでは動かないので,スクリプトが欲しい場合は上のrefを使う.)