MATLABでよく使う配列操作と若干マニアックな操作についてまとめてみた。
目次
行ベクトルの要素の追加
[a b]
>> b = 11:1:20 b = 11 12 13 14 15 16 17 18 19 20 >> a = 0:1:10 a = 0 1 2 3 4 5 6 7 8 9 10 >> a = [a b] a = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
horzcat(A, B)
>> a = 0:1:10 a = 0 1 2 3 4 5 6 7 8 9 10 >> a = horzcat(a, 11) a = 0 1 2 3 4 5 6 7 8 9 10 11
列ベクトルの要素の追加
[a; b]
>> a = (1:1:10)' a = 1 2 3 4 5 6 7 8 9 10 >> b = (11:1:20)' b = 11 12 13 14 15 16 17 18 19 20 >> [a; b] ans = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
vertcat
>> a = (1:1:10)' a = 1 2 3 4 5 6 7 8 9 10 >> b = (11:1:20)' b = 11 12 13 14 15 16 17 18 19 20 >> a = vertcat(a, b) a = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
空の配列に追加
バッチ処理して配列を追加したい場合がよくある。 その場合は、まず空の配列を用意しておく。>> a = double.empty(0, 10) a = 0×10 empty double matrix
行か列のどちらかのサイズを0にしておく必要がある。
それからvertcat / horzcatで行または列を追加する:
>> a = vertcat(a, 1:1:10) a = 1 2 3 4 5 6 7 8 9 10 >> a = vertcat(a, 11:1:20) a = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
要素を削除するには
追加だけでなく、要素を削除する方法も大事。
例えば 3番目の要素を削除するには
a(3) = [];とすれば良い。
>> a = (1:1:10) a = 1 2 3 4 5 6 7 8 9 10 >> a(3) = [] a = 1 2 4 5 6 7 8 9 10
このやり方は列ベクトルか行ベクトルだけに使える(行列の場合は使えない)。
このやり方はセル配列に対しても使える。(Matlabでセル配列内の特定の要素を削除 – yuishiノート)
マニアック編
ソート
A = [5 1 9 3];
[~, idx] = sort(A, 'descend'); % 降順のインデックス
B = A(idx); % → 9 5 3 1
ポイント:sortの第2出力で「並び替えの順番」だけ取得し、並べ替えや他配列の同期ソートに使える。
条件を満たす要素だけ抽出
A = [10, 25, 30, 5, 15];
B = A(A > 20); % → 25 30
ポイント:A > 20
が [false true true false false]
という論理配列になり、そのtrueの要素だけ抽出。
循環シフト(circshift)
A = [1 2 3 4];
B = circshift(A, 2); % → [3 4 1 2]
ポイント:FFT処理やパターン比較などで使える。多次元配列でも行列方向を指定可能。
要素を繰り返して配列にする(repmat / repelem)
A = [1 2 3];
B = repelem(A, 3); % → [1 1 1 2 2 2 3 3 3]
C = repmat(A, 2, 1); % 行方向に2回繰り返し
ポイント:サンプル拡張やパターン作成に便利。
要素の条件付き置き換え
A = [10, 25, 30, 5, 15];
A(A < 20) = NaN;
% → [10 NaN NaN 5 NaN] (A<20の箇所だけNaN)
ポイント:if文なしで一括置換できる。
グリッド生成と関数適用(meshgrid / arrayfun)
[X, Y] = meshgrid(1:3, 1:3);
Z = arrayfun(@(x,y) x^2 + y^2, X, Y);
% Z =
% 2 5 10
% 5 8 13
% 10 13 18
ポイント:forループを回さずに任意の関数を各要素に適用できる。
行列 → ベクトル化 (2D→1D)
A = [10 20 30; 40 50 60];
B = A(:); % → [10; 40; 20; 50; 30; 60]
ポイント:A(:)
は列優先で展開され、ベクトル演算にそのまま利用可能。
行列の対角成分・非対角成分の抽出
M = [1 2 3; 4 5 6; 7 8 9];
main_diag = diag(M); % → [1; 5; 9]
offset_diag = diag(M, 1); % → [2; 6] (1つ右の対角)
ポイント:行列の対角処理や行列式計算で便利。
配列要素の一括変換(bsxfun風)
A = [1 2 3; 4 5 6];
B = A ./ sum(A, 2); % 各行を行和で割る(正規化)
ポイント:行単位や列単位でのスケーリング処理が簡単。
モジュロ演算で周期パターン作成
n = 12;
pattern = mod(0:n-1, 3) + 1;
% → [1 2 3 1 2 3 1 2 3 1 2 3]
ポイント:周期的なインデックスや分類番号を作るのに使える。