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

MATLAB Note/計算 の変更点

Top / MATLAB Note / 計算
  • 追加された行はこの色です。
  • 削除された行はこの色です。
  • MATLAB Note/計算 へ行く。

#freeze
-目次
#contents

**四則演算をする [#i3969f5b]
-参考:[[行列と配列について:http://shakosv.sk.tsukuba.ac.jp/ShakoDoc/MATLAB/helpdesk/techdoc/getstart/gets9.htm]]
 +   	加算
 -	減算
 *	乗算
 /	除算
 \	左除算 (左から右を割る)
 ^	ベキ乗
 '	複素共役転置

--余りは rem(x,y) (XをYで割ったときの余り)
--商は   floor(x/y)
--平方根(ルート)は sqrt(X)

-実行例

 >> 1 + 2    %足し算
 ans =
     3

 >> 5 - 3    %引き算
 ans =
     2

 >> 3 * 10   %掛け算
 ans =
    30

 >> 5 / 10   %割り算
 ans =
    0.5000

 >> 5 \ 10   %割り算 (左から右を割る)
 ans =
     2

 >> 2 ^ 4    %べき算
 ans =
    16

-ベクトル同士の四則演算
--以下の配列A,Bを使って説明します。
 >> A = [1 2 ; 3 4]
    A =
        1     2
        3     4
 >> B = [-1 -2 ; -3 -4]
    B =
       -1    -2
       -3    -4

 >> A + B
 ans =
     0     0
     0     0

 >> A - B
 ans =
     2     4
     6     8

 >> A * B
 ans =
    -7   -10
   -15   -22

 >> A .* B   %行列の各要素同士の演算
 ans =
    -1    -4
    -9   -16

 >> A / B
 ans =
    -1     0
     0    -1

 >> A ./ B   %行列の各要素同士の演算
 ans =
    -1    -1
    -1    -1

**配列を宣言する [#o0cac6a5]
-配列(ベクトル)の値を指定して宣言
 >> A = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]  %4行4列の配列Aを宣言
    A =
       16     3     2    13
        5    10    11     8
        9     6     7    12
        4    15    14     1
--[[行列と魔方陣:行列と配列 (MATLAB公式):http://www.mathworks.co.uk/access/helpdesk_ja_JP/help/techdoc/learn_matlab/f2-12841.html]] より引用しました。

-配列(ベクトル)を自動生成する
 >> A = 1:10       %1から10までの整数を含む行ベクトルを作成
    A =
        1     2     3     4     5     6     7     8     9    10
 >> A = 100:-7:50  %100から50まで、-7おきに行ベクトルを作成
    A =
      100    93    86    79    72    65    58    51
-ゼロ行列を作る
 >> Z = zeros(2,4) %2行4列のゼロ行列
    Z =
        0     0     0     0
        0     0     0     0
-単位行列を作る
 >> F = ones(3,3)  %3行3列の単位行列
    F =
        1     1     1
        1     1     1
        1     1     1
 >> F = 5 * ones(3,3)
    F =
        5     5     5
        5     5     5
        5     5     5
-一様分布(ランダム分布)する要素からなる行列
 >> N = fix(10*rand(1,10))
    N =
       9     2     6     4     8     7     4     0     8     4
 ※値は実行するたびに変わります。(注:再起動後は同じ値が選択されます!)
 ※FIX(X)は、Xの要素をゼロ方向の最も近い整数に丸めます。(小数点以下切り捨て)
-正規分布する要素からなる行列
 >> R = randn(4,4)
    R =
      -0.4326   -1.1465    0.3273   -0.5883
      -1.6656    1.1909    0.1746    2.1832
       0.1253    1.1892   -0.1867   -0.1364
       0.2877   -0.0376    0.7258    0.1139

**配列を操作する [#n3a474a1]
-以下の配列Aを使って説明します。(([[行列と魔方陣:行列と配列 (MATLAB公式):http://www.mathworks.co.uk/access/helpdesk_ja_JP/help/techdoc/learn_matlab/f2-12841.html]] より引用しました。))
 >> A = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]
    A =
       16     3     2    13
        5    10    11     8
        9     6     7    12
        4    15    14     1

--配列のサイズを取得
 >> size(A)
    ans =
         4     4
 >> length(A) %行の長さ、列の長さのうち、大きいほうを出力
    ans =
         4
--Aの各列を合計
 >> sum(A)    %各列を合計
 ans =
    34    34    34    34
 >> sum(A,1)  %(別のやり方)Aの1次元成分の合計
 ans =
    34    34    34    34
--行と列を入れ替え
 >> A'        %主対角に対して行列を入れ替え(行ベクトルを列ベクトルに)
 ans =
    16     5     9     4
     3    10     6    15
     2    11     7    14
    13     8    12     1
--Aの各行を合計( = 入れ替えた後の各列を合計)
 >> sum(A')   %各行を合計
 ans =
    34    34    34    34
 >> sum(A')'  %行として出力
 ans =
    34
    34
    34
    34
 >> sum(A,2)  %(別のやり方)Aの2次元成分の合計
 ans =
    34
    34
    34
    34
--配列を90度反転
 >> rot90(A)  %配列を90度反転
 ans =
    13     8    12     1
     2    11     7    14
     3    10     6    15
    16     5     9     4
--主対角要素を取り出す
 >> diag(A)
 ans =
    16
    10
     7
     1
--指定要素を取り出す
 >> A(1:3,2)            %A の 2 番目の列の最初から 3 番目までの要素を取り出す
 ans =
     3
    10
     6
 >> A(2:end,2)          %A の 2 番目の列の 2 番目から最後までの要素を取り出す
 ans =
     10
      6
     15
--指定要素を検索/入れ替える
 >> k = find( A < 5 )   %配列Aの要素のうち、5以下の値の位置番号を出力する
    k =
        4
        5
        9
       16
 ※関数 find は、与えられた論理条件になる配列要素のインデックスを決めます。
 ※位置番号は、4行4列の配列Aの場合、
     [  1   5   9  13
        2   6  10  14
        3   7  11  15
        4   8  12  16  ]  となります。
 >> A(k)                 %k により決められた順番で実際の値を表示
    ans =
        4
        3
        2
        1
 >> A(k) = NaN           %kにより取り出された位置番号の値をNaNに入れ替える
    A =
       16   NaN   NaN    13
        5    10    11     8
        9     6     7    12
      NaN    15    14   NaN

--配列を結合する
 >> B = [A  A; A  A]  %4つの小行列Aを連結した8行8列の行列Bを作成
    B =
       16     3     2    13    16     3     2    13
        5    10    11     8     5    10    11     8
        9     6     7    12     9     6     7    12
        4    15    14     1     4    15    14     1
       16     3     2    13    16     3     2    13
        5    10    11     8     5    10    11     8
        9     6     7    12     9     6     7    12
        4    15    14     1     4    15    14     1
--指定した要素を削除する
 >> X = A;            %配列Aの中身を配列Xにコピーする
 >> X(:,2) = []       %Xの2番目の列を削除
    X =
       16     2    13
        5    11     8
        9     7    12
        4    14     1
--配列をソートする
 >> sort(A)            %各列の行成分を並べ替え(昇順)
    ans =
         4     3     2     1
         5     6     7     8
         9    10    11    12
        16    15    14    13
 >> sort(A,'descend')  %各列の行成分を並べ替え(降順)
    ans =
        16    15    14    13
         9    10    11    12
         5     6     7     8
         4     3     2     1

**基本統計計算 [#fa7ce95c]
-参考:[[MATLABドキュメント データ解析と統計量:http://dl.cybernet.co.jp/matlab/support/manual/r14/toolbox/matlab/data_analysis/?/matlab/support/manual/r14/toolbox/matlab/data_analysis/da_comm2.shtml]]

-以下の配列dataを使って説明します。
 >> data = [1 2 3 4 ; 5 6 7 8 ; 9 10 11 12] 
    data =
         1     2     3     4
         5     6     7     8
         9    10    11    12
--平均値
 >> mean(data)            %各列の平均を求める
    ans =
         5     6     7     8
 >> mean(data')'          %各行の平均を求める
    ans =
        2.5000
        6.5000
       10.5000
--中央値
 >> median(data)          %各列の中央値を出力
    ans =
         5     6     7     8
 >> median(data(:,3))     %3列目の中央値を出力
    ans =
         7
 >> median(data(1,:))     %1行目の中央値を出力
    ans =
        2.5000
 >> median(data(1:2,:))   %1,2行目の各列の中央値を出力
    ans =
         3     4     5     6
--標準偏差
 >> std(data)             %各列の標準偏差を出力
    ans =
         4     4     4     4
#ref(makeDeviation.m);
--分散
 >> var(data)             %各列の分散値を出力
    ans =
        16    16    16    16
--共分散
 >> cov(data)
    ans =
        16    16    16    16
        16    16    16    16
        16    16    16    16
        16    16    16    16
--相関係数
 >> corrcoef(data)
    ans =
         1     1     1     1
         1     1     1     1
         1     1     1     1
         1     1     1     1
--標本範囲(最大値と最小値間の差)
 >> data2 = [1 3 5 9 ; 2 3 7 1; 1 5 7 4]             %ここで使うデータセットを宣言
    data2 =
         1     3     5     9
         2     3     7     1
         1     5     7     4
 >> range(data2)
    ans =
         1     2     2     8

--欠損値があるとき
---[[参考 NaNの取り扱い:http://dl.cybernet.co.jp/matlab/support/manual/r13/toolbox/matlab/math_anal/?/matlab/support/manual/r13/toolbox/matlab/math_anal/datafun8.shtml#17220]]
--
 >> dataNaN = [1 2 NaN 4 ; NaN 6 7 8 ; 9 10 11 NaN]  %ここで使うデータセットを宣言
    dataNaN =
         1     2   NaN     4
       NaN     6     7     8
         9    10    11   NaN
 
 %欠測値を無視した場合の最大値
 >> nanmax(dataNaN)
    ans =
         9    10    11     8
 %欠測値を無視した場合の平均値
 >> nanmean(dataNaN)
    (結果は省略)
 %欠測値を無視した場合の中央値
 >> nanmedian(dataNaN)
 %欠測値を無視した場合の最小値
 >> nanmin(dataNaN)
 %欠測値を無視した場合の標準偏差
 >> nanstd(dataNaN)
 %欠測値を無視した場合の和
 >> nansum(dataNaN)

-[[find関数でNaNを検出する方法:http://www.cybernet.co.jp/matlab/support/techkwdb/search_view.php?id=1625]]
--関数 isnan を使う。

**微分積分 [#d52c4030]
***ピークピッキング & 零交差点を求める [#m6651517]
-2次導関数(微分)によって連続値のピークを取り出す方法を確認します。以下を実行してください。
#geshi(matlab){{
X = [1 2 3 4 3 2 3 4 3 4 5 4 3 2 1]
dX = diff(X)		%一次導関数を求める
d2X = diff(dX)		%二次導関数を求める
subplot(3,1,1),plot(X);
subplot(3,1,2),plot(dX),xlim([0 15]);
subplot(3,1,3),plot(d2X),xlim([0 15]);
}}
--二次導関数がマイナスの値が、極大値(山のピーク)になっています。