1.Research Crack/Matlab/Tips

Top > 1.Research Crack > Matlab > Tips

                         ★の意味
                         ★☆☆(星1つ): なんとなく.
                         ★★☆(星2つ): その方法を見つけた時に空が晴れていたよ.
                         ★★★(星3つ): 今日は星空がきれいだ,きっと.

ファイル入力関数:load, csvwrite, textread ★★★

load ***.mat ★★★

matファイルの読み込み.matファイルではない時はASCII(タブ区切りデータ)として読み込む

load ***.mat

csvwrite ***.csv ★★★

カンマで値が区切られたファイルの読み込み

csvread ***.csv

textread [A,...] = textread('filename','format','headerlines', *) ★★★

テキストファイルから書式化されたデータを読む

[A,B,C,...] = textread('filename','format','headerlines', *)
'headerlines':ファイルの始めからスキップするライン数



ex.[code, response] = textread('behavior.txt', '%s%s', 'headerlines', 4)

異なるディレクトリにあるデータの読み込み.★★☆

複数のディレクトリに分けている時,その読み込みや書き出しなど.
次の3つの条件を満たすように場合分けする.

okuraという場合のデータは../Rawdata/AR_2/okura/に納めたい.
okuraのデータはグラフのラベルなどで MO というイニシャルを使いたい.
n_set = 5;に設定する.
n_sub = 3;
for sub = 1:n_sub
    
    switch sub
        case 1
            n_set = 5;subject = 'MO';
            dir = '../Rawdata/AR_2/okura/';
        case 2 
            n_set = 5;subject = 'NN';
            dir = '../Rawdata/AR_2/nanjyo/';
        case 3
            n_set = 5;subject = 'KY';
            dir = '../Rawdata/AR_2/yamamoto/';
    end

 
end

ファイル名が連続しているファイルを読み込む時.★★☆

 TEST1.asc,TEST2.asc,TEST3.asc,TEST4.asc,TEST5.asc
と連続したファイルがあり,この5つを読み込むコード.

n_set = 5;
for sets = 1:n_set
    filename = ['TEST', num2str(sets), '.asc'];
    load(filename)
end

ファイルの出力関数:save, saveas, csvwrite ★★★

save filename.mat data ★★★★★★

Matファイル, ASCIIファイルで出力する.Matファイルで出力する時には

save filename.mat data

として,ASCIIにする時に以下のように"-ASCII"オプションをつける.ファイル拡張子に関わらず,ASCII形式となる.

save filename -ASCII: 8桁のASCII書式.
save filename -ASCII -DOUBLE: 6桁のASCII書式.
save filename -ASCII -TABS: タブで区切り.
save filename  -ASCII-DOUBLE -TABS: 16桁で,タブで区切り.

また,下記のようにすれば,time_から始まるファイル全てをセーブする

save data.mat time_*  

csvwrite ★★★

カンマ区切りの形式でファイルに出力する.

csvwrite filename.csv

saveas, 指定したフォーマットでFigureを保存する ★★☆

saveas(h,'filename.ext')
ex.
figure_name = ['compar', task_name,task_name_rnd, '.eps'];
saveas(gcf, figure_name)

指定できる拡張子(ext)は次の通り.

bmp:Windows ビットマップ

eps:EPS Level 1

fig:MATLAB フィギュア

jpg:JPEG イメージ

png:ポータブルネットワークグラフ

ai:Adobe Illustrator '88

emf:メタファイル

m:MATLAB M-ファイル

pbm:ポータブルビットマップ

pcx:ペイントブラッシュ24-ビット

pgm:ポータブルグレーマップ

ppm:ポータブル Pixmap

tif:TIFFイメージ、圧縮データ



※僕は,ファイル容量が小さくて閲覧のしやすいpngとTeX用にeps,この2つを保存している.
※eps形式で保存する時,下記のようにしないとバグが出る事がある.
 saveas(h, figure_name, 'psc')
もしくは
 saveas(h, figure_name, 'psc2')
前者はLevel1 Color PostScriptフォーマット,後者はLevel 2 Color PostScriptフォーマット.

多数のファイルをいっぺんに読み取る方法

if param.verinfo == 1
 param.start_time = 1000;
 param.plot_xlim = [1000 4500];
elseif param.verinfo == 2
 param.start_time = 0;
 param.plot_xlim = [0 3500];
end
%今開いているディレクトリにファイルが無くても,
%MeteData/behavior_data/aperiodic_kawawaki/
%のようにファイルがあるフォルダを指定しておけば良い.
%今回の場合,MeteDataディレクトリが今開いている
%ディレクトリの下にある.
param.pPath = ['MeteData/'];
param.dPath = {[param.pPath ...
	       'behavior_data/aperiodic_kawawaki/'],...
	       [param.pPath ...
           'behavior_data/aperiodic_shika/']};
%------------------------------------------------------------
%data_0**というファイル名が用意されている.**にはいるのは01-29.
 %set data file name
 i=1;
 sub = 1;
 while(1) %(1)を書くと無限ループ
   name  = sprintf('data_%03d', i-1); 
   dataFileName  = sprintf('%s%s.dat', param.dPath{sub}, name);
   
   %check existing data files
   fid = fopen(dataFileName, 'r');
   if fid==-1
       break;%while(1)で無限ループになっているので,ここでファイルが
             %見つからなかったら,ループを抜けるという条件にしている.
   end
   fclose(fid);
 	%load data
	%つまりここでは

    % MeteData/behavior_data/aperiodic_kawawaki/data_0**.dat

	%をロードしている.
	  load(dataFileName);  
	  load(dataFileNameE);
	  
	  i=i+1;

end

条件文,繰り返し:for,while,switch,if,,,

for文注意 for文の自然数で. 

駄目な例

for ARp = 0.1:0.1:0.9
    AR(1,ARp*10) = Gauss(1);
end

良い例

for ARp = 1:1:9
    AR(1,ARp) = Gauss(1);
end

Switchステートメントのcase文で複数の値を定義する.★★★

switch i
  case {statement1, statement2, ...}
end

Switchステートメントで先行するcase文以外の場合に実行する ★★★

switch i
  case {case1, case2, ...}
     statement
  otherwise 
     statement
end

比較演算子,論理演算子 ★★★

比較演算子
比較演算子による実行結果は、0,1のロジカルデータとなる.
関係式を満たしていれば1を、満たしてなければ0を出力.

A==B AとBは等しい
A~=B AとBは等しくない
A <B AはBより小さい
A<=B AはBより小さいか等しい
A>B AはBより大きい
A>=B AはBより大きいか等しい

論理演算子

& 	要素ごとの論理積
| 	要素ごとの論理和
~ 	論理否定
xor	排他的論理和
&&	ショートサーキット論理和
||	ショートサーキット論理積
any	非ゼロ要素が含まれているか
all	全ての要素が非ゼロであるか

数え上げ ★★★

for i = 1:B
    order = ARorder(i);
    eval(sprintf('Count%d = Count%d +1;',order,order));
end

インクリメント ★★★

i = i+1;

コード編集

セルモード ★☆☆

Matlabのエディタを使用している場合,コードの一部分だけを実行する事ができる.
行頭に

%%

を書くと,セルと認識され,セル毎にプログラムを走らせることができる.

「% %」の後に半角スペースを入れてコメントを入れるとボールド字で表示される.セルにカーソルがある時は,次のセル(次に「% %」がある場所)の前までの範囲が薄い黄色で表示される.プログラムも見やすくなる.

ただし,この機能を使うためにはセルモードを有効にしておく必要がある.Matlabのエディタの「セル」-「セルモードを有効にする」をクリックする.

スマートインデント Ctr - I ★☆☆

Matlabのエディタを使用している場合,

Ctr - I

でプログラムのインデントを見やすく整理してくれる.



ex.

整理前.

for sub = 1:3  
switch sub
case 1
 n_set = 5;subject = 'MO';
  dir = '../Rawdata/AR_1/#####/';
               case 2
            n_set = 5;subject = 'NN';
      dir = '../Rawdata/AR_1/#####/';
case 3
   n_set = 5;subject = 'KY';
  dir = '../Rawdata/AR_1/######/';
    end
        end

Ctr - Iで整理後.

for sub = 1:3
    switch sub
        case 1
            n_set = 5;subject = 'MO';
            dir = '../Rawdata/AR_1/#####/';
        case 2
            n_set = 5;subject = 'NN';
            dir = '../Rawdata/AR_1/#####/';
        case 3
            n_set = 5;subject = 'KY';
            dir = '../Rawdata/AR_1/######/';
    end
end



自分で書いている時にインデントは意識しながら,書いているのでだいたいに必要はないのだけれど,たまにコピペの乱用で汚くなった時に使える.

コメントアウト ★★★

コメントアウトする行を指定して(ドラッグして),

Ctrl+R
すると指定した行がコメントアウトされる.
コメントアウトされている行を指定して,

Ctrl+T
でコメントアウトが解除.

ブロックコメントアウトは

%{... %}
で囲った範囲は複数行にわたってコメントアウトされるが,上記の方が便利.

ブロックコメントアウト.★★★

方法1.

Matlabのエディタを使用している場合,
コメントアウトしたい場所をドラッグ&ドロップなどで指定して,

Ctr - R

のショートカットキーにより一括で各行頭に「%」が書き込まれ,コメントアウトできる.

同様に,コメントアウトを解除したい場所を指定して,

Ctr - T

でコメントアウトを解除できる.

ちなみに自分はWindows環境で作業しているので,emacsなどの
エディタは使用してません.



方法2

%{,%}で挟まれた箇所が一括してコメントアウトされる.

%{ 
   for i = 1:N
    .
    .
    .
   end
%}

とfor~endまでがコメントアウトされる.

ただし,%{の行にコメントを書くと無効になるので注意.
方法2はMatlabのエディタでなくても使えるけれど,自分はほとんど使用して居らず.

グラフ描画

Figure Windowのタイトルバーに名前を表示する.

h = figure(n)

set(h, 'Name', 'name');

グラフの線,座標軸の設定 ★★★

*には数値,#には記号・文字等を適宜代入する各コマンドは他のMatlabの解説ページでは単語毎に頭文字が大文字となるが,以下で書いているように全て小文字でもOK.例えば,LineWidthと書いて説明されていることが多いが,linewidthで大丈夫.

  • 線の設定
    set(h,...
    'linewidth',*, ... %線の太さ,標準0.5
    'linestyle','#', ...
    'color','#',...
    'marker','#','markersize',* )

linewidthはパワポで見やすくするために,2に設定している.

linestyleは離散値的なグラフの時は'.-b'をよく使っている.

'color','marker','markersize'の簡単な設定ならば,
linestyleで設定可能(cf.表1).

  • 座標軸の設定
    set(gca, ... 
        'LineWidth',*, ...
        'GridLineStyle','#', ...
        'Xlim',*,  'Ylim',*, ...
        'Xtick',*,'Ytick',*,... 
        'XtickLabel',**,'YtickLabel',**,...
                  %ex1.'Block1|Block2|Block3', ex2.1:3:13  
        'xgrid','#','ygrid','#',... %on,off
        'Fontsize', * ,... 
        'Color','k') 
  • その他,ラベルやタイトル
    xlabel({'########';'########'},'FontSize',*) % ラベルを改行したい時は{ }で囲む
    ylabel('####################','FontSize', *)
    legend('########','#########','FontSize', *)
    title('######################','FontSize',*)

  • 表1.'color','marker','linestyle(gridlinestyle)'の簡易設定
    ColorMarkerLine Style(Grid Line Style)
    b blue. point- solid
    g greeno circle: dotted
    r redx x-mark-. dashdot
    c cyan+ plus-- dashed
    m magenta* star(none) no line
    y yellows square
    k blackd diamond
    v triangle (down)
    ^ triangle (up)
    < triangle (left)
    > triangle (right)
    p pentagram
    h hexagram

グラフの線を太くしたり,色を変えたりするだけでも
adobeのIllustratorなどでいじりたくないので,
ほとんどMatlab上で編集している.

グラフの保存(*.eps,*.pngの両形式で保存.) ★★☆

グラフは以下の2つの形式で

  • *.eps :LaTeX,Word原稿用.
  • *.png :フォルダ閲覧用.

で保存する.*.pngは,Windows環境で,フォルダの表示形式を「縮小版」に
設定した時に一覧できるようにするため.
同一グラフを*.epsと*.pngで同じ名前のファイルにしておき,*.pngを
見ながら,隣にある*.epsファイルを選択して開いている.
ファイル名だけでは直感的ではない時があり,*.pngを用意して
グラフ内容を視覚的に探せるようにしておくと非常にファイル選択
が早くなった.

グラフを作成において,あるxにマークを付けるコード

figure(2)
   subplot(5,3,trials)
   hold on
       plot(vel(:,trials))
       plot(check_time(trials),0,'xr',...  %←
           'markersize',15,'linewidth',2)
       plot(covert_starting_time(trials),0,'xg',...
           'markersize',15,'linewidth',2)
       xlim([0 4000])
      % ylim([-2000 2000]) %horizontalの時のスケール
       ylim([-200 200]) %verticalの時のスケール
   hold off 

複数軸のグラフのコード

    y1 = eye_target_vel(1:3.5*500);
    y2 = eye_target_acc(1:3.5*500);
    x = 1:3.5*500;
    figure(trial)
    %subplot(5,6,trial)
       hl1 = line(x,abs(eye_target_acc(1:3.5*500)),'color','r');
       ax1 = gca;
       set(ax1,'xcolor','r','ycolor','r',...
           'ylim',[0 100000],...
           'xlim',[0 3.5*500]);
       ax2 = axes('position',get(ax1,'position'),...
           'yAxisLocation','right',...
           'xAxisLocation','top',...   
           'color','none',...
           'Xcolor','b','Ycolor','b',...
            'xlim',[0 3.5*500],...
            'ylim',[0 300]);
       hl2 = line(x,abs(eye_target_vel(1:3.5*500)),'color','b','parent',ax2);
       xlimits = get(ax1,'xlim');
       ylimits = get(ax1,'ylim');
       y2limits = get(ax2,'ylim');
       xinc = (xlimits(2) - xlimits(1))/5;
       yinc = (ylimits(2) - ylimits(1))/5;
       y2inc = (y2limits(2) - y2limits(1))/5;
       set(ax1,'xtick',[xlimits(1):xinc:xlimits(2)],...
           'ytick',[ylimits(1):yinc:ylimits(2)]);
       set(ax2,'xtick',[xlimits(1):xinc:xlimits(2)],...
            'ytick',[y2limits(1):y2inc:y2limits(2)],'ygrid','on');

起動時のワークスペース(作業ディレクトリ)の変更 ★★☆

C:\Program Files\MATLAB71\toolbox\localに

startup.m

を作成し,

cd c:\***\******

と書き込んで,任意のフォルダを指定すると,指定したフォルダが起動時のワークスペース(作業ディレクトリ)となる.



「Documents and settings」などのスペースが入ったディレクトリの下層にあるディレクトリを指定する時は

cd('c:\***\***')

と()でくくって指定する.

※WindowsOSでは「Documents and settings」など,デフォルトのディレクトリにスペースが入っているディレクトリ名があったりする.「cd ***」の形式でコードを書くと,スペースのせいでcdコマンドに対して複数の引数があるように認識してしまうのでうまくいかない.

その他

Matlabの起動時の標準設定を変える(startup.m)

matlab_R****.app/toolbox/local(←たぶん)内にstartup.mがあります(ファイルがなければstartup.mを作成する).Matlabは最初にファイル内にを読み込みますので,このファイル内にいろいろ記述しておけば,それが起動時の標準設定になります.

※最初に用意されているファイルは startupsav.m かもしれません.

%STARTUPSAV   Startup file
%   Change the name of this file to STARTUP.M. The file 
%   is executed when MATLAB starts up, if it exists 
%   anywhere on the path.  In this example, the
%   MAT-file generated during quitting using FINISHSAV
%   is loaded into MATLAB during startup.

Matlab起動時の作業ディレクトリを指定する.

Matlabは最初にstartup.mを読み込みますので,(ファイルがなければstartup.mを作成して),ファイル内に

cd('/***/***/')

を記述します.「/Users/***/」にはMatlabを起動したときに開きたいディレクトリを記述します.こうすると,Matlab起動時のCurrent Folderが/Users/***/となります.

Figureの標準背景を灰色から白にする.

startup.mに
set(0, 'defaultFigureColor', [1, 1, 1]);

デバッグの時に ★☆☆

ifステートメントで下記のように0としておけば,statement1は実行されない.1とすると実行される.

if 0
  statement1
end

プログラムの計算進行をチェック.★★☆

for文などを多用し,長い計算時間を要する時,途中でどこまで進んだか確認するために使う.

for sub = 1:n_set 
.
.
.
  fprintf('Finish analysis %d !!\n\n',sub)
end

fprintf('Finish all analyses !!\n\n')



Commanad Windowに


Finish analysis 1 !!

Finish analysis 2 !!

Finish analysis 3 !!

Finish analysis 4 !!
 .
 .
 .
Finish all analyses !!

とfor文が1回繰り返される事に,「Finish analysis # !!」が表示され,すべてのプログラムが終了したら,「Finish all analyses !!」 どこまで進んでいるか確認できる.

tic,toc プログラムの計算時間計測 ★★☆

tic,tocで挟まれたプログラムの計算時間計測を出力してくれる.秒単位.
例えば,for文などでまわす時,テストプログラムでfor文1回の計算時間を知っておくと,全計算時間がだいたい把握できる.

tic
 j = 0;
 for i = 1:1000
     j = j+1
 end
toc

計算結果を逐次表示する・しない「;セミコロン」★★★

文末にセミコロンをつけないとCommand Window
に計算結果が逐一表示され,やたらと時間がかかることに.
逆にあえてすぐにその値を見たい時は,はずしておく.

要素の比較、抽出、置き換え ★★★

条件検索と行列要素の置き換え ★★★

A =
1.0668 0.2944 -0.6918 -1.4410
0.0593 -1.3362 0.8580 0.5711
-0.0956 0.7143 1.2540 -0.3999
-0.8323 1.6236 -1.5937 0.6900
》A(A<=0)=NaN
A =
1.0668 0.2944 NaN NaN
0.0593 NaN 0.8580 0.5711
NaN 0.7143 1.2540 NaN
NaN 1.6236 NaN 0.6900

条件を満たすインデックスの検索 ★★★

>A = [1,3,2,4,3]
>find(A==2)
ans = 3,5

end,コロン(:)使用しての行列の値の抽出 ★★★

》A(end-1:end, 2:end-1) % end は最後の要素の指定
ans =
0.7143 1.2540
1.6236 -1.5937

行列xの次元を抽出

ndims(x)

Matlabではファイル名の最初に数字をおくと読み取ってくれない.

profile viewer

ショートカットキー

強制終了★★★

Ctrl+C

文字列コマンドを実行するための関数eval

trial = 1;
a = sprintf('data_%03dE(:,1)',trial-1);
>>a = data_000E(:,1)

とaには文字列が入る.

data_000E(:,1)のデータの中身をaに入れたい場合は
evalをつかう.

trial = 1;
a = eval(sprintf('data_%03dE(:,1)',trial-1));

Tag: matlab tool code Tips

最終更新日: 2014-11-21 (金) 16:14:05 (1705d)

このページをブックマーク:

 

TOP