FC2ブログ

初心者によるMATLABメモ

3次元形状やってんのになぜかMATLABを使わされることになった人のメモ。

 

検索エンジンから来た方は読みたい記事が表示されていない可能性があります。
その場合、左メニューのフォームでブログ内を検索すると見たい記事を見れると思います。
もしくは、カテゴリー名をクリックしていただくと各カテゴリーの記事のリストが見れます。

[基本] データから最小二乗近似曲線を描く

この極値をプロットする記事に続き,今度は実験データなどのノイズがのったデータから最小自乗近似曲線を描く方法です。
最小二乗法で多項式近似する関数は最初からMATLABに用意されているので,それを使います。
使うのは下のpolyfitpolyvalの2つ。
簡単に言うと、polyfitで近似のための多項式F(x)を求め,polyvalでその多項式y=F(x)の値を計算する。
P = polyfit(X,Y,N); … データ[X,Y]を最小二乗近似するN次多項式関数を求める。polyfuncにはその関数の各項の係数が配列で渡される。
Y = polyval(P,X); … N次多項式にXを代入する。

以下に,実際に例とか。適当なデータを作って最小二乗近似曲線をプロットしてみる例。
まずこんな感じの適当なデータを作ってみた。
% 適当なダミーデータ
dh = 25;
pp = [0.5,2,0.2,1.2];
data = [linspace(pp(1),pp(2),dh),linspace(pp(2),pp(3),dh),linspace(pp(3),pp(end),dh)];
noise = (rand(1, length(data))-0.5)/2;
data =[0:length(data)-1; data+noise]';

data_x = data(:,1);
data_y = data(:,2);

データはプロットするとこんな感じに。
最小二乗1

で,実際にこのデータの近似曲線を求める。
データ点があまりに多い場合はpoly_x = data_x(1:10:end);とかして間引くといいと思います。
% N次多項式で最小二乗近似
nn = 3; % 近似曲線の次数
polyfunc = polyfit(data_x, data_y, nn);

% データのx座標を近似多項式に代入して,近似曲線のy座標を求める。
poly_y = polyval(polyfunc, data_x);

後はこれをプロットしてみるとこんな感じに。
グラフは上から「データ全体のプロット」,「データ全体のプロットに近似曲線のプロットを重ねてみたもの」,「近似曲線のプロット」です。
まぁ結果は見たまんまな感じなんで問題ないかと。
最小二乗2

最後に参考までにこのグラフを書いたコードを載せておきます。
clear all;close all;

% 適当なダミーデータ
dh = 25;
pp = [0.5,2,0.2,1.2];
data = [linspace(pp(1),pp(2),dh),linspace(pp(2),pp(3),dh),linspace(pp(3),pp(end),dh)];
noise = (rand(1, length(data))-0.5)/2;
data =[0:length(data)-1; data+noise]';
% ここまで

data_x = data(:,1);
data_y = data(:,2);

% N次多項式で最小二乗近似
nn = 3; % 近似曲線の次数
polyfunc = polyfit(data_x, data_y, nn);

% データのx座標を近似多項式に代入して,近似曲線のy座標を求める。
poly_y = polyval(polyfunc, data_x);

% 以下グラフ作成 ============
scrsz = get(0, 'ScreenSize');
figure('InvertHardcopy', 'off', 'Color', [1 1 1], 'Position', [200 scrsz(4)-620 480 480]);

% 軸作成
set(0,'defaultAxesFontSize',8);
set(0,'defaultAxesFontName','Arial');
set(0,'defaultTextFontSize',10);
set(0,'defaultTextFontName','Arial');
axes('Parent', gcf, 'PlotBoxAspectRatio', [1 1 1], 'Box', 'on');

% グラフ -----
subplot(3, 1, 1), plot(data_x, data_y, 'b.:');
set(gca, 'Title', ...
text( 'String', 'All Data Plot', ...
'FontSize', 12, 'FontName', 'Times', ...
'FontWeight', 'Bold', 'FontAngle', 'Italic'), ...
'XlimMode', 'manual', 'Xlim', [0, data_x(end)], 'YlimMode', 'manual', 'Ylim', [min(data_y), max(data_y)*1.1]);
xlabel('X');
ylabel('Y');

subplot(3, 1, 2), plot(data_x, data_y, 'b.:', data_x, poly_y, 'r-');
set(gca, 'Title', ...
text( 'String', 'All Data & Fitting Curve Plot', ...
'FontSize', 12, 'FontName', 'Times', ...
'FontWeight', 'Bold', 'FontAngle', 'Italic'), ...
'XlimMode', 'manual', 'Xlim', [0, data_x(end)], 'YlimMode', 'manual', 'Ylim', [min(data_y), max(data_y)*1.1]);
xlabel('X');
ylabel('Y');

subplot(3, 1, 3), plot(data_x, poly_y, 'r-');
set(gca, 'Title', ...
text( 'String', 'Fitting Curve Plot', ...
'FontSize', 12, 'FontName', 'Times', ...
'FontWeight', 'Bold', 'FontAngle', 'Italic'), ...
'XlimMode', 'manual', 'Xlim', [0, data_x(end)], 'YlimMode', 'manual', 'Ylim', [min(data_y), max(data_y)*1.1]);
xlabel('X');
ylabel('Y');

あ、あと一応csvデータからグラフを書くなら,ダミーデータの部分を削除して↓に書き換えればオッケーかと。
data=csvread('aaa.csv');

data_x = data(:,1);
data_y = data(:,2);

polyfit (MATLAB Function Reference)
polyval (MATLAB Function Reference)
スポンサーサイト



このエントリに付けられたタグ|MATLABグラフ最小二乗法最小自乗法近似曲線

[その他] Windows XPのMATLAB 2007bで英語メニュー

今まで(MATLAB 2007aまで)日本語のWindowsXPでMATLABのメニューを英語にしたい場合,環境変数MATLAB_LANGを作って,値をenとすれば英語のメニューになっていました(参考)。
しかし,2007bだとこの環境変数が効かなくなっています。

で、MATLAB2007bで英語メニューに変える方法なんですが,こんな感じ。(Windows XP以外はこれでいくのかわかりません。)
1. コントロールパネルの「地域と言語のオプション」を開く。
2. 地域オプションタブの「標準と形式」を適当に英語(米国)とかにする。
3. MATLABを起動。

ただ、他のアプリケーションで不都合が生じるような…
まぁこれを読んでる人は日本語わかるはずなんで日本語メニューのままで使うとは思いますが、参考までに。

一応,「標準と形式」をこんなふう↓に変えると…
MATLAB英語メニュー1


MATLABがこうなります↓
MATLAB英語メニュー2


参考:MATLAB:テクニカルFAQ Windows版 MATLAB のメニュー等の言語切り替え(日本語、英語)はどのように行いますか?:サイバネットシステム
参考:The MathWorks - How has locale changed in MATLAB 7.5 (R2007b)?
このエントリに付けられたタグ|MATLAB2007b英語メニュー

[ファイル操作] MATLAB 2007aよりdirが返すファイル構造体にdatenumフィールドが追加

今更気づいたんですが,
MATLAB 2007aよりdirが返すファイル構造体にdatenumフィールドが追加されてるんですね。

正式なリリースがよくわから無いけど、
matlabroottoolboxmatlabgeneraldir.mを見る限り「% $ Revision: 5.12.4.4 $ $Date: 2007/03/21 00:54:41 $」って書いてありますね。

実際にMATLAB 2006bまでのdirのヘルプを見てみると,こう↓ですが…
D = DIR('directory_name') は、つぎのフィールドをもつ M×1 の構造体
として結果を返します。
name-- ファイル名
date-- 更新日時
bytes   -- ファイルに割り当てられたバイト数
isdir   -- name がディレクトリ名の場合 1、そうでなければ 0

MATLAB 2007aからのdirのヘルプではこう↓なっています。
D = DIR('directory_name') は、つぎのフィールドをもつ M×1 の構造体
として結果を返します。
name-- ファイル名
date-- 更新日時
bytes   -- ファイルに割り当てられたバイト数
isdir   -- name がディレクトリ名の場合 1、そうでなければ 0
datenum -- MATLAB シリアル日付番号での更新日時

これは何に使うかというと,
MATLAB 2006bまでは例えば今日更新したファイル名だけを表示したい場合,こんな感じで日付でdirしたファイルを絞り込んでいましたが,
(しかし、なぜ2007bからdateフィールドは'dd-m-yyyy HH:MM:SS'のフォーマットなんでしょうか?自分たちで決めてるDateFormにない形式なのに…)
F = dir();
dateform = 'dd-mmm-yyyy HH:MM:SS';
Ftoday = F(find(datenum({F.date},dateform)>=fix(now)));
{Ftoday.name}

datenumフィールドを利用することにより,このように書けます。
どちらの方が簡単なコードかはまぁ一目瞭然だと思います。
F = dir();
Ftoday = F(find([F.datenum]>=fix(now)));
{Ftoday.name}


dir MATLAB Function Reference
datestr MATLAB Function Reference
datenum MATLAB Function Reference
このエントリに付けられたタグ|MATLABdirdatestrdatenum

[その他] MATLAB 2007bよりdirしたときの日付のフォーマットが変更

ここでも書いたんですが,なぜか2007bからdirしたときのdateフィールドが'dd-m-yyyy HH:MM:SS'になってます。(今までは'dd-mmm-yyyy HH:MM:SS'だった)
自分たちで決めてるDateFormにない形式なのにこれにしてるとは…
と思って、調べたんですがこういうことらしい↓…日本語環境だとおいおいってことみたいですね。
なんかメニューとかと同じでロケール依存になったみたいだ。
Changes to the Date Format. Users may see changes in the date formats, depending on the locale. For example, using the Japanese locale, the format of the date field in the dir M-function in MATLAB Version 7.4 might be displayed as: 3-Feb-2007 while in MATLAB Version 7.5, the same value might be displayed as: 03-2-2007"
参考:Release Notes for R2007b

とりあえずMathworks的に文字の日付は非効率だからシリアルの日付のdatenumフィールドをどうせみんな使うでしょ?ってことみたい。

でも,こういう勝手なことをされると前に作った関数とか変更しないといけなくて,相当不便な気が…
すでにこういう質問↓も届いてますし。サイバネットもう少しこういうのアナウンスしておいて欲しいところ。
The MathWorks - Why does DATENUM give me an error message when I pass German date strings as input arguments in MATLAB? - 1-532C44
このエントリに付けられたタグ|MATLAB2007bdirdatenum日付

[ファイル操作] 指定したディレクトリのファイルとディレクトリを再帰的に検索 2

前にも書きましたが、MATLABで用意されているdirでは,ファイルのリストを再帰的に取得することが出来ません.
で,File Exchangeとかにもいろいろ上がっているんですが,僕なりの再帰的なファイルとディレクトリ(フォルダ)の取得方法です。

一応,MATLAB 2007aより追加されたdatenumフィールドを2006b以前のバージョンでも持つようにしました。(このエントリのmファイル(dir_recursive.m))
これを見る限りとりあえずMATLAB 2006b以前では,dateフィールドをそのままdatenum()に突っ込めばシリアルの日付を得られるみたいなので,フォーマットは指定していません。
こんな感じ↓
% MATLAB 2006bまでの場合datenumフィールドがないので追加する 
if ~isfield(F, 'datenum') F = arrayfun(@(strc) setfield(strc, 'datenum', datenum({strc.date})), F); end;

で,実際のdir_recursive()のソースがこれです。
下から3行目の太文字の部分は,2007b以降のバージョンでは標準のdir()との整合性がとれなくなるので,コメントアウトしておいた方がいいかもしれません。
function [F, D] = dir_recursive(TARGET_PATH)

% 引数無しの場合はカレントディレクトリに対して実行.
if nargin == 0  TARGET_PATH = pwd; end;

% 指定したファイル,ディレクトリの情報を調べる..
[num, pathinfo] = fileattrib(TARGET_PATH);

%%%% ファイルが指定された場合
if pathinfo(1).directory~=1 
    F = dir(TARGET_PATH);
    target_dir = fileparts(pathinfo(1).Name);
    F = arrayfun(@(strc) setfield(strc, 'path', fullfile(target_dir, strc.name)), F);
%%%% ディレクトリ(フォルダ)が指定された場合
else 
    if num~=1 error('ディレクトリを指定する場合にはワイルドカードは使えません。'); end;
    target_dir = pathinfo.Name;

    % サブディレクトリのリスト取得
    dirs = strread(genpath(target_dir), '%s', 'delimiter', ';');

    % 再帰的に検索 
    F = [];
    for ind = 1:length(dirs) 
        path = dirs{ind};
        ff = dir(path);

        % 構造体にpathフィールドを追加 & "," と ".."を削除.
        ff = arrayfun(@(strc) setfield(strc, 'path', fullfile(path, strc.name)), ff(3:end));

        if isempty(F) 
            F = ff;
        else 
            F(end+1:end+length(ff)) = ff;
        end;
    end;
end;

% datenumフィールドがない場合,追加する。
if ~isfield(F, 'datenum') F = arrayfun(@(strc) setfield(strc, 'datenum', datenum({strc.date})), F); end;

% MATLAB 2007b以降の場合にdateフィールドをMATLAB標準のフォーマット'dd-mmm-yyyy HH:MM:SS'に変換する。
if datenum(version('-date')) > 733268 F = arrayfun(@(strc) setfield(strc, 'date', datestr(strc.datenum)), F); end;


% ファイルとディレクトリのリストに分別する.
D = F(find([F.isdir]));
F = F(find(~[F.isdir]));

よくわかんないですが,サブフォルダのショートカットとかあるとこけたりするかもしれません。

一応ヘルプ的なもの。
% DIR_RECURSIVE  : 指定したファイルもしくはディレクトリ(フォルダ)のファイルとディレクトリを再帰的に検索し,リストを返す。

%    [F, D] = DIR_RECURSIVE()は,カレントディレクトリより下の階層にあるファイルとディレクトリをリストします。
%
%    F = DIR_RECURSIVE()
%    カレントディレクトリより下の階層にあるファイルとディレクトリをリストします。
%    
%    F = DIR_RECURSIVE('file_name')
%    ファイルが指定された場合,そのファイルのみの構造体がFとして返ります。
%    
%    [F, D] = DIR_RECURSIVE('dir_path')
%    dir_pathで指定したディレクトリより下の階層にあるファイルとディレクトリをリストします。
%    
%    Fにはファイルのリストが,Dにはディレクトリのリストが返ります。
%    また,FとDは下記のフィールドを持つ構造体です。
%        name  -- ディレクトリ,もしくはファイル名
%        path  -- ディレクトリ,もしくはファイルの絶対パス
%        date  -- ファイルを修正した最新日
%        datenum  --  dateフィールドのMATLAB シリアル日時
%        bytes - ファイルへの割り当てバイト数
%        isdir - nameがディレクトリの場合1、そうでなければ0
%    
%    参考 DIR


dir MATLAB Function Reference
ダウンロード:このエントリのmファイル(dir_recursive.m) 左クリックでお願いします。
このエントリに付けられたタグ|MATLABファイル操作ファイルリストdirファイル検索

[その他] MATLAB 2008aからアクティベーションが導入される模様

なにやらMATLAB 2008aからアクティベーションが導入される模様です。
ユーザ登録してる人はメールが来ていると思いますが,一応My MathWorks Accountからもリンクされてます。
ログインして,下の画像の赤い四角で囲んだ辺りに表示されてます。


イントロのムービーを見てみたんですが,一応インストール画面はこんなのらしいです。
matlab2007a_activation002.jpg

ちゃんと英語を読んでない、というか英語がよくわからないのですが、
コンカレント・ライセンスの場合は,従来通りでいいらしいので,インディビデュアル・ライセンスでも,多分従来のネットワークライセンスの場合に行われていたように,LANカードのフィジカルアドレス(=下の文中のhost ID)で認証するんだと思います。(推測)
英語分かる人に詳しく教えて戴きたいところ。
Activating Network Licenses
Network Named User and Concurrent license options require the use of FLEXnet® network license servers to manage your MathWorks software licenses. These license servers have always required activation by manually submitting the server host ID to The MathWorks and retrieving your License File through your MathWorks Account. This process will not change for R2008a.
The MathWorks - Activating Software(※要MathWorks Accountログイン)

まぁ、さすがにサイバネットよりアナウンスがあるので大丈夫でしょうが、気に留めておいたほうがいいかもしれません。

アクティベーション - Wikipedia
このエントリに付けられたタグ|MATLAB2008aアクティベーション

[Geometry] 等間隔に並んだ点列を取得する(linspacem)

MATLABには,線形に等間隔なベクトルを作成するための関数として,linspaceが用意されていますが,この関数は入力としてスカラしか受け付けないので,等間隔に並んだ点列が欲しいときなどはいちいちループさせないといけません。
% 等間隔に並んだ点列を取得する簡単な悪い例
n=5;
d1 = [0;0;0];
d2 = [3;2;4];

y = zeros(3 ,n);
for jj=1:3 
    y(jj,:) = linspace(d1(jj),d2(jj),n);
end;

いちいちこんなことするのはダルいし、効率も悪いのでlinspaceを拡張し,等間隔に並んだ点列を取得する(linspacem)という関数を作ってみました。(mファイルのダウンロード
中身でやっていることは省略しますが,一応[1,2,3]、[1;2;3]そしてx,y,zを次元を変えて表した場合に対応しています。
それと追加で2つのマトリックスを線形補間することもできるようにしてあります。
function y = linspacem(d1, d2, n) 

if nargin == 2 n = 100; end;
n = floor(n);

sz = size(d1);
if ~isequal(sz, size(d2)) error('2つの入力の次元が異なります。'); end;

% x,y,z...と次元を変えて座標を表した場合
if min(sz)==1 && length(sz)>2
    sz(2) = n;
    d1 = d1(:);
    d2 = d2(:);
    y = reshape([repmat(d1,1,n) + (d2-d1)*((0:(n-1))/(n-1))]', sz);
% 縦ベクトル
elseif sz(2)==1 
    y = repmat(d1,1,n) + (d2-d1)*((0:(n-1))/(n-1));
% 横ベクトル
elseif sz(1)==1 
    y = repmat(d1,n,1) + ((0:(n-1))/(n-1))'*(d2-d1);
% 行列
else 
    d1 = d1(:);
    d2 = d2(:);
    y = reshape( (repmat(d1,1,n) + (d2-d1)*((0:(n-1))/(n-1))), [sz,n]);
end;

実際の使用について簡単な例を挙げます。
これは座標を縦ベクトルで表した2点[0;0;0]と[3;2;4]の間を5分割した点列の取得の例です。
>> linspacem([0;0;0], [3;2;4], 5)
ans =
         0    0.7500    1.5000    2.2500    3.0000
         0    0.5000    1.0000    1.5000    2.0000
         0    1.0000    2.0000    3.0000    4.0000

次に座標を横ベクトルで表した場合の例。
>> linspacem([0,0,0], [3,2,4], 5)
ans =
         0         0         0
    0.7500    0.5000    1.0000
    1.5000    1.0000    2.0000
    2.2500    1.5000    3.0000
    3.0000    2.0000    4.0000

また,異なる表現法で4分割にしてみた場合。
>> linspacem(zeros(1,1,3), reshape([3,2,4],[1 1 3]), 4)
ans(:,:,1) =
     0     1     2     3

ans(:,:,2) =
         0    0.6667    1.3333    2.0000

ans(:,:,3) =
         0    1.3333    2.6667    4.0000

一応確認のために2点(0,0)、(6,1)間を10分割した点列をプロットしたものを表示してみると,こんな感じ↓にちゃんと分割できていることが確認できます。
linspacem

最後に最初に書いた悪い例のようにlinspaceをforループさせた関数linspace0を作り,今回作ったlinspaceと実行速度の比較をしてみました。
やはりforループさせると実行速度が落ちることがわかります。
>> tic;for ii=1:1e4 linspacem([0;0;0], [3;2;5], 1e3); end;toc;
経過時間は1.403997秒です
>> tic;for ii=1:1e4 linspace0([0;0;0], [3;2;5], 1e3); end;toc;
経過時間は2.996953秒です

とりあえず僕が書いたmファイルは下記リンクに置いてあります。
ダウンロードしてパスが通っているフォルダに置いてください。

参考:MATLAB:マニュアル:MATLAB:関数:サイバネットシステム-MATLAB Function Reference linspace
このエントリのmファイル(linspacem.m)

このエントリに付けられたタグ|MATLABlinspacelinspacem等間隔な点列

[基本] 改行しても実行しない(複数行に渡るコマンド)

そういえば、MATLABを使い始めた当初、これで困ったということを思い出したので、書いておきます。
実際にMATLABを使っていると,1行に書くと長くなり過ぎて見ずらいので,複数の行に渡ってひとつのコマンドを書きたいことがでてくると思います。(Figureのプロパティ設定など)
MATLABでは通常のプログラム言語のように「;(セミコロン)」をつけなくても,その行を1つのコマンドとして解釈してしまうため,複数の行に渡ってひとつのコマンドを書く場合には,改行する前に下記のように「.(ピリオド)」を3つ以上書く必要があります。
...(3つのピリオド) 行の最後に書くと次の行までコマンドが続いていることを意味する。

簡単な例を書くと、このような↓グラフの軸設定などの時に使えます。
set(gca, 'Title', ...
text( 'String', 'All Data Plot', ...
'FontSize', 12, 'FontName', 'Times', ...
'FontWeight', 'Bold', 'FontAngle', 'Italic'), ...
'XlimMode', 'manual', 'Xlim', [0, data_x(end)], 'YlimMode', 'manual', 'Ylim', [min(data_y), max(data_y)*1.1]);

実際にこれがひつようなのはmファイル内だけだと思うのですが,一応コマンドウインドウでもちゃんと機能します。
>> 1 ...
+1

ans =

     2

これのヘルプはどこにあるんだろう?と思ったのですが,「Special Characters」としてひと括りに載っているんですね。

参考:Special Characters [ ] ( ) {} = ' . ... , ; % ! -MATLAB:マニュアル:MATLAB:関数:サイバネットシステム
このエントリに付けられたタグ|MATLAB基本複数行改行

[基本] 複数行にわたるコメント(コメントアウト)

先ほど複数行に渡るコマンドについて書いたので、ついでに複数行にわたるコメントについて書いておきます。
通常の場合は頭に「%(パーセント)」をつけることで1行のコメントを書くことが出来ますが、複数行に渡ってコメントを書きたい場合もあると思います。
複数行にわたるコメントは下記のように「%{」と「%}」のみの行で複数行を挟むことで実現できます。
%{
コメント
コメント
%}

ここで,注意事項を書いておくと,例えば下記のような表記は認めらず、「%{」と「%}」の行に他のコメントを書くことはできません。「%{¥n … ¥n%}¥n」と書いた方がわかりやすいかも知れません。
%{
駄目なコメント%}

同様に下記も駄目です。
%{駄目なコメント
%}

また,「%」と「{」を離すことも許されません。
% {
駄目なコメント
%}

最後にもうひとつ注意事項を書いておくと,「%{」と「%}」を用いた複数行のコメントは,関数の頭に書くヘルプテキストの部分には使用することは出来ません。
関数の頭に書くヘルプテキストに関しては、1行ごと行頭に「%」を表記してやる必要があります。
実際に下記のようなtest()とtest2()を用意して,helpを表示してみます。
comment_test()は下記です。
function comment_test()
% COMMENT_TEST テスト
% ヘルプを書くところ

disp(1);

comment_test2()は下記です。
function comment_test2()
%{
COMMENT_TEST2 テスト
ヘルプを書くところ
%}

disp(1);

実際に実行してみると、下記のように「%{」と「%}」を用いて、ヘルプテキストを書いた場合にはそれ自体はコメントであることが認識されている(エラーはでていない)ものの,ヘルプテキストとしては認識されていないことがわかります。
おそらくhelpコマンドが(%[^¥n]+¥n)+という正規表現を最短マッチさせているからだと思うんですが、よくわかりません。
>> help comment_test
  TEST テスト
  ヘルプを書くところ

>> help comment_test2
 {

また、この表記法はmファイルのある部分をコメントアウトしたいときにも使えます。

参考:Special Characters [ ] ( ) {} = ' . ... , ; % ! -MATLAB:マニュアル:MATLAB:関数:サイバネットシステム
参考:MATLAB:マニュアル:R2006:MATLAB:プログラミング:サイバネットシステム - M-ファイルの基本部分
このエントリに付けられたタグ|MATLAB基本複数行コメントコメントアウト

[グラフ、プロット] エクセル(Microsoft Excel)でのグラフに対応するMATLABの関数

Excelでのグラフに対応するMATLABの関数 基本的にMATLABのプロット関連は,このあたりを見てもらえれば分かると思いますが,以下にExcelでのグラフに対応したMATLABの関数を表にしてみました。

Excelでのグラフの種類MATLABでの関数名
縦棒グラフbar
3Dの縦棒グラフbar3
横棒グラフbarh
3Dの横棒グラフbarh3
折れ線グラフplot
円グラフpie
散布図scatter
面グラフarea
ドーナツグラフpieの重ねあわせで実装。
レーダーチャートpolar
等高線グラフcontour
3D等高線グラフcontour3
バブルチャートscatter
株価チャートFinancial Toolboxを持っているならこのあたりの関数
持っていない場合はbarerrorbarを組み合わせるか,patchとlineで実装する。
円柱グラフ、円錐グラフ、ピラミッド グラフ個人的に3D棒グラフと別に違わないと思うので略。

株価チャートを書きたい場合は、File ExchangeのCandlestick Graphとかを使うのもいいかもしれません。

また,この記事の方法でMatlabからエクセルにグラフを描くのもひとつの手です。
 
参考:-利用可能なグラフの種類 - Excel - Microsoft Office Online
参考:MATLAB Central File Exchange - Candlestick Graph
参考:初心者によるMATLABメモ| MATLABからエクセル(Microsoft Excel)にグラフを描く
このエントリに付けられたタグ|MATLABグラフプロットExcel関数名エクセル

[グラフ、プロット] グラフ(プロット)にタイトルを追加(変更)

MATLABでグラフ(プロット)にタイトルを追加したり,変更したりするコマンドです。
title('タイトル') … 現在のAxesにタイトルを追加,もしくは変更する。
title('タイトル', 'プロパティ名', '値'...) … タイトルを追加もしくは変更し,タイトルのtextオブジェクトに指定したプロパティをセットする。

このコマンドは,現在のAxesのタイトルプロパティを指定したテキストオブジェクトに変更する下記のコマンドのショートカットになっています。
set(gca, 'Title', text('String', 'タイトル', ...))

実際に棒グラフを書いて,タイトルを追加してみる例です。
figure('InvertHardcopy', 'off', 'Color', [1 1 1], 'Position', [200 100 320 160]);
hold all;
bar(100*rand(1,6));
title('縦の棒グラフ');



続いて,タイトルのスタイルを変更してみる。
title('タイトルのスタイル変更', 'FontSize', 16, 'FontWeight', 'bold', 'Color', [1,0,0], 'FontName', 'MSゴシック');



最後に直接Axesプロパティを操作してタイトルを変更する例。
set(gca, 'Title',text( 'String', '直接axsのプロパティを操作', 'Color', [0,0,1], 'FontSize', 10, 'FontName', 'MSゴシック'));




参考:MATLAB Function Reference title
このエントリに付けられたタグ|MATLABグラフのタイトルtitle

[グラフ、プロット] プロット(グラフ)の軸の範囲を設定

プロット(グラフ)の軸の範囲を設定
MATLABでグラフ(プロット)の軸の範囲を手動で設定するコマンドは,もしくはxlim, ylim, zlimです。詳しくはリンク先を見てもらいたいと思います。
axis([X軸の最小値, X軸の最大値, Y軸の最小値, Y軸の最大値])
axis([X軸の最小値, X軸の最大値, Y軸の最小値, Y軸の最大値, Z軸の最小値, Z軸の最大値])
または個別に…
xlim([X軸の最小値, X軸の最大値]) 
ylim([Y軸の最小値, Y軸の最大値]) … 各軸の範囲を指定する。
zlim([Z軸の最小値, Z軸の最大値]) 

これらのコマンドはそれぞれ下記のコマンドのショートカットになっています。
set(gca, 'XLim', [X軸の最小値, X軸の最大値]]);
set(gca, 'YLim', [X軸の最小値, X軸の最大値]]);
set(gca, 'ZLim', [X軸の最小値, X軸の最大値]]);

実際に使った簡単な例を載せたいと思います。
まず,適当なプロットを描きます。
data = [[0,0.3,1,1.4,2,2.6];[1,2,5,10,4,6]];
figure('InvertHardcopy', 'off', 'Color', [1 1 1], 'Position', [200 100 320 160]);
hold all;
plot(data(1,:),data(2,:));



それぞれの軸の範囲を指定してみます。このように手動で指定した範囲外のプロットは表示されません。
xlim([0,4]);
ylim([5,10]);



次にデータにぴったりフィットするように軸を設定してみた例です。
xlim([min(data(1,:)),max(data(1,:))]);
ylim([min(data(2,:)),max(data(2,:))]);



また、これらの関数は引数なしで実行した場合,現在の設定されている値を配列で返します。
例えば、下を実行するとcylimにY軸の設定されている範囲が返ります。
cylim = ylim;

これらの使い方としては,例えば下記のようにすることでY軸の範囲がy=0と対称な範囲に指定することができます。
figure('InvertHardcopy', 'off', 'Color', [1 1 1], 'Position', [200 100 320 160]);
hold all;
plot(data(1,:),data(2,:));
cy = max(abs(ylim));
ylim([-cy,cy]);
set(gca, 'Xgrid', 'on', 'Ygrid', 'on');




参考:MATLAB Function Reference axis
参考:MATLAB Function Reference xlim, ylim, zlim
このエントリに付けられたタグ|MATLABグラフプロット軸の範囲axisxlimylimzlim

[グラフ、プロット] プロット(グラフ)で目盛りの刻みを手動で設定する

MATLABでプロット(グラフ)で目盛りの刻みを手動で設定する方法です。
特定の関数は用意されておらず,直接Axesオブジェクトのプロパティをset()で弄る必要があります。
目盛りの刻みを手動で設定
set(gca,'XTick',目盛りの刻みの配列);
set(gca,'YTick',目盛りの刻みの配列);
set(gca,'ZTick',目盛りの刻みの配列);
※目盛りの刻みの配列は,単調増加な配列である必要があります。

まず、プロットのX軸に2、5、8にだけ目盛りをふった例です。
x = [0,2,4,5,6,8];
y = [1,2,5,10,4,6];

figure('InvertHardcopy', 'off', 'Color', [1 1 1], 'Position', [200 100 320 160]);
hold all;
plot(x,y,'b-o');
set(gca,'XTick',[2,5,8]);



さらに,このグラフのデータ点と一致するところにだけ目盛りをふって,グリッドを付けた例です。
ここでunique()しているのは上にも書いたように目盛りの刻みの配列は,単調増加な配列である必要があるからです。(sort()では重複する目盛りになってしまう可能性があるためunique())
set(gca,'XTick',unique(x),'YTick',sort(y));
set(gca,'XGrid','on','YGrid','on');



また,get()を用いて現在の目盛りの刻みを配列として取得することで,既存の目盛り刻みに特定の目盛りを追加することが出来ます。
ここでは↑の例のx=3.5に目盛りを追加してみます。
xticks = get(gca,'XTick');
xticks = sort([xticks,3.5]);
set(gca,'XTick',xticks);




参考:MATLAB Function Reference - Axes Properties
参考:MATLAB Function Reference - get
参考:MATLAB Function Reference - set
このエントリに付けられたタグ|MATLABグラフプロット目盛り目盛りの刻み