メモ

  • 範囲指定の演算には()が必要
  • テンソルにすると,max, meanなどが楽.作り方は,forで回してしまったほうが良い
  • 表示が処理に対して追いついていない場合->drawnowコマンド

目次

下位ページ

参考ページ

疑問

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配列への代入

  • 長さを明示した部分配列にセル配列を突っ込む感じ.
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

トラブルシューティング

カラーバー付きscatter plotなどがベクタ出力できない

  • カラーバーが壊れていて,唯一ベクタ出力できるpainterレンダリングが使えなくなっているらしい.
  • カラーバーを直すスクリプト:filergb2cm.m
    • 参考(これだけでは動かないので,スクリプトが欲しい場合は上のrefを使う.)

添付ファイル: filergb2cm.m 1239件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-01-16 (月) 11:14:38 (2656d)