*メモ [#y7ee86b8] - 範囲指定の演算には()が必要 - テンソルにすると,max, meanなどが楽.作り方は,forで回してしまったほうが良い -表示が処理に対して追いついていない場合->drawnowコマンド *目次 [#ua6b73f9] #contents *下位ページ [#o4feb489] -[[MathWorks]] -[[Simulink]] *参考ページ [#p50f33f1] -http://www.sc.ctrl.titech.ac.jp/~saitou/matlab.html#struct --matlabでObject指向 *疑問 [#t7b24b90] **cellの中身に直接カッコオペレータ [#i28b54ae] -retCellFunc(args){1,1}などはできない? **structure [#c1290fa4] -st([1 3 5]).member_mat(3, 5) *Matlab文法 [#o53832c0] **structure [#p1c249e3] -基本的にはmap --何の事前定義なしにa.c=3と書いて良い --a.c.e=4もOK -[[Structure with Multiple Fields>http://www.mathworks.com/help/matlab/ref/struct.html]]のようにすると,struct arrayをつくることが出来る.s(1)のようにする.非常にやばい感じの文法 **古いクラスの書き方 [#d71f109b] -[[古いクラスの書き方>http://www.neuro.sfc.keio.ac.jp/~masato/study/matlab/class.htm]] --@CookingフォルダにCooking.m,display.mなどを突っ込むとそれがコンストラクタ,メンバ関数になる. --メンバ関数にselfを毎回引数に取らなければならずかなりクソ? **新しいクラスの書き方 [#u81966e0] -[[新しいクラスの書き方>http://qiita.com/sshojiro/items/6e837d3bfef493ea11b0]](このサンプルのままだとset accessができない気がする) --実体クラスをモジュール,ポインタクラスをインスタンスと呼び,区別される --ゲッタ,セッタを実装することができる. **引数が全て文字列の時だけのカッコが省略可能 [#s57ab33e] -引数の全てが文字列の場合だけ引数のカッコが省略可能 -以下の二つが同値 --foo a b c --foo('a','b','c') **viで変更した時に待たないと利用可能にならない [#vbc0ee1a] -rehashで解決. **行列のfor [#ub20263f] -for v=Aと表現すると,vはA(:, i)の順番で呼ばれる. **cell配列 [#w59b3972] -cell配列=全ての要素がcellの配列 --[{1} {2}; {3} {4}]など --上記の省略形として{1 2; 3 4}と書ける -{}, ()の使い分けなど. -http://bun6memo.blogspot.jp/2013/06/matlab.html ***cell配列への代入 [#md068e3f] -長さを明示した部分配列にセル配列を突っ込む感じ. 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 [#ia5f305f] -cellの行列なので当たり前 -{[1],[2]}をforで回すと,{[1]}が各要素として代入される. a = {[1],[2]}; for elem = a print(elem{1}); % elemではまだcell end ***cell文字列を普通の文字列にする [#h67149f1] s = strjoin(s_cell); *標準関数 [#a3d9e7c6] **loadとsave [#p05e085e] whos -file durer.mat %matファイルの変数名を見る save('150911.mat', 'var1', 'var2', 'var3', '-v7.3'); %特定の変数だけセーブ load('141110.mat', 'pf2'); % 特定の変数だけロード **mat, cell配列へのバッチ処理 [#p87e2f6b] ***cellfind[#ce1902e6] -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 [#o1591a86] -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 [#yf15bfd8] -変数の意味 --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の見方 [#e8858c8d] -plot(cumsum(expected), '+'); **移動平均 [#a0f2dcf6] -filter(デジタルフィルタ)が使える. --分子部分だけ使ってz変換として利用. r = [0 1 2 3 4]; A=[-1 3]; f=filter(A, 1, r) f = 0 -1 1 3 5 **線形近似(擬似逆行列演算) [#v2c9821f] -http://www.mathworks.co.jp/jp/help/matlab/data_analysis/programmatic-fitting.html#f1-7306 -モデル 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 [#ff2e49a9] -plotを分割できる. --subplot(w, h, index)を宣言してからplot, scatterをすれば分割ができる. --title, xlabel, ylabelなどはplotのあと. **sprintf [#v6a52c3a] -c言語のsprintfとの差分は,"が'となっていることのみ. **多次元データの見方 [#qc3b0842] -imagesc --全部生で見られる -pca --次元を落とす **分布の見方 [#u05508a2] -mean, var, hist -hist [nelements,xcenters] = hist(data) bar(xcenters,nelements) *快適なプログラミングのために [#zddcf4af] **matlabプログラムの高速化ハック [#t31b9901] http://www.aclab.esys.tsukuba.ac.jp/~ohbuchi/matlab.pdf http://myenigma.hatenablog.com/entry/20121231/1357024090#4ループではなく行列演算を使用する **間接参照 [#k5dbe974] -[[ポインタを使いたい時用>http://d.hatena.ne.jp/saitodevel01/20101210/1291978535]] --超すごい **メモリの節約 [#he53d0ec] -きちんと使わなくなった変数はsaveして,必要になったらloadするように. **不必要なfind [#k7eb807c] -A(A<0.5) = 0でよい.findはいらない. **Shuffle [#cf53254e] -データのシャッフル --Period Shuffle Surrogate,実験順序生成のために. data = data_num(randperm(length(data_num))); **Color Bar [#e541ff6d] imagescのcolorbarを変えたい時に使う. colormap(-sortrows(-gray)) **figを開く・epsに変換する [#b6cbbcea] -figを開く openfig('input.fig'); -epsに変換 rgb2cm openfig('input.fig', 'new', 'invisible'); print(gcf,'-depsc','-painters','output.eps') **包絡線 [#ecc76aff] http://jp.mathworks.com/matlabcentral/answers/103700- *Matlab環境 [#vadf232b] ** 初期設定について [#l67d276d] -matlab/project1を作る. -project1/load_env.mにpathの設定などを入れる -project1/load_project1.mにデータのload関数を入れる. **ワークスペースの保存と再開 [#h8999827] -作業の終わりにはsave('yyyymmdd.mat','-v7.3'); -作業の始めにload('yyyymmdd.mat, '-v7.3'); ** マルチプロセスによる並列化 [#h006c598] -マルチプロセスでmatlabの実行 screen matlab -nodisplay [command] [ctr-ad] # detach -戻って見たい場合は, screen -ls screen -r ** vim配列のmatlab [#e9f55ae6] -無理らしい --いちおう,CUIで起動中に!vi hoge.mとして,matlab内でviを立ち上げることでできなくない. ** matlabのオプション [#ib5a0a39] -http://d.hatena.ne.jp/ruicc/20091216/1260981595 このページには,描画すらもCUIでできるようにする方法が書いてある. -'-r' 初回コマンドで指定可能.hoge.mを作って,-r hogeとすれば,あたかもhogeを実行するコマンドになる. -'-nodisplay' GUIの表示非表示 **Exit Blocker [#pede0f4b] 非保存のファイルを1つ残すべき **Matlab Coder [#dbd00894] -Matlab->Cのコンパイル --https://jp.mathworks.com/products/matlab-coder/features.html?requestedDomain=jp.mathworks.com *トラブルシューティング [#e9621601] **カラーバー付きscatter plotなどがベクタ出力できない [#m5e5d8a1] -カラーバーが壊れていて,唯一ベクタ出力できるpainterレンダリングが使えなくなっているらしい. -カラーバーを直すスクリプト:&ref(./rgb2cm.m); --[[参考>http://jp.mathworks.com/matlabcentral/fileexchange/35469-rgb2cm-fix-rgb-color-data-in-painters-mode/all_files]](これだけでは動かないので,スクリプトが欲しい場合は上のrefを使う.) |