*メモ [#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を使う.)

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