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]);
}}
--二次導関数がマイナスの値が、極大値(山のピーク)になっています。