MATLABを本格的に使うにあたり、知っておくと便利なコマンド・機能をまとめました。
前準備
ワークスペースを初期化
clear
このコマンドで、ワークスペースにあるデータを全て削除することができます。
残存データによる予期しない動作(よくある例:バグのあるプログラムが見かけ上正しく動いてしまう)を防止するために、プログラムの頭に常にこれを書いておくことをオススメします。
開いているfigureウィンドウを全て閉じる
close all
このコマンドで、開いているfigureウィンドウをまとめて閉じることができます。プログラムの頭で使用することが多いですが、コマンドウィンドウからでも使用できるので、作業効率化にも重宝します。
データ操作
行列生成
% 行列の初期化 M = zeros(2); % 2行2列で要素が全て0の行列 M = zeros(2,3); % 2行3列で要素が全て0の行列 M = ones(2); % 2行2列で要素が全て1の行列 M = ones(2,3); % 2行3列で要素が全て1の行列 M = nan(2); % 2行2列で要素が全てNaNの行列 M = nan(2,3); % 2行3列で要素が全てNaNの行列 M = eye(2); % 2行2列の単位行列
これらのコマンドは、単なるデータ生成としてだけでなく、変数メモリの確保にもよく使われます。
例えば次のようにforループにてデータの各要素にアクセスする際は、forループの前でデータを初期化し、メモリを確保しておかないと処理が遅くなります。
% forループで漸化式を解く例 num_of_loop = 1000; % ループ数設定 % 使用する変数を初期化し、データサイズ分のメモリ確保。 % これをしなくても動くが、ループごとにxのサイズを増やすことになり、処理が遅くなる x = nan(1,num_of_loop+1); for num = 1 : num_of_loop x(num+1) = f(x(num)); % 何か漸化式を解く end
zeros、ones、nan関数のどれで初期化しても構いませんが、個人的にはnanがおすすめです。何かの間違いですべての要素に値が入らなかった場合、残ったNaNが計算を失敗させてすぐに不具合に気付けるからです。
連番データの生成
x = linspace(0, 100, 50); % 0から100までを50分割した配列(要素数50の横ベクトル) x = 0 : 100; % 0から100まで1ずつカウントアップした配列(要素数101の横ベクトル) x = 0 : 10 : 100; % 0から100まで10ずつカウントアップした配列(要素数11の横ベクトル)
データをまとめて計算
MATLABの数学関数は、引数に行列(ベクトル)を与えると、それぞれの要素に対する計算結果を行列(ベクトル)で返してくれます。
x = 1 : 10; y = sin(x); % yには[sin(1) sin(2) ... sin(10)]が入る plot(x,y);
ドット付きの演算子と併用することで、さまざまな値に対する計算を1行で実施できるため、便利です。(しかもデータ要素ごとにforループを回して計算するよりも断然速い)
x = 1 : 10; y = (sin(x) + x.^2 + 3) ./ x; % さまざまなxに対して一気に計算 plot(x,y);
自分で関数を作る際も、次のように要素演算に対応させておくと、便利に使用することができます。
x = 1 : 10; y = myfunc(x); plot(x,y); function output = myfunc(input) output = (sin(input) + input.^2 + 3) ./ input; end
行列サイズ取得
M = [1 2 3 4 5; 6 7 8 9 0]; % 2行5列の行列 [row, col] = size(M); % rowに行数(2)、colに列数(5)が返る row = size(M,1); % 行数(2)だけ取得 col = size(M,2); % 列数(5)だけ取得 len = length(M); % 最も長い方向の要素数が返る。この場合は5。
length関数は、ベクトルの要素数を調べるときに、それが縦ベクトルか横ベクトルかいちいち確認せずに使えるので意外と重宝します。
endを使った要素指定
使う機会はそこまで多くありませんが、知っておくとたまに超便利です。
% 適当にデータ作成 delta = 0.01; t = 1:delta:5; x = sin(t); x_without_1 = x(2:end); % 最初の要素を省いたデータを取得 x_without_end = x(1:end-1); % 最後の要素を省いたデータを取得 dx = (x(2:end) - x(1:end-1)) / delta; % 例えばこんな感じで数値微分するときに便利 dx = diff(x) / delta; % この用途ならdiff関数を使っても同じことができるケド
文字列操作
文字列結合
文字列結合用にstrcatという関数がありますが、単純に文字列を大括弧でくくるだけでも結合可能です。
str1 = '1つ目'; str2 = '2つ目'; str3 = '3つ目'; % どちらも'1つ目2つ目3つ目'が得られる str_cat = strcat(str1, str2, str3); str_cat2 = [str1 str2 str3];
数値を文字列に変換
number = 5.39309134; numstr = num2str(number); % '5.3931'が得られる numstr = num2str(number,3); % 有効桁数3で、'5.39'が得られる
情報表示
コマンドウィンドウに情報表示
計算中の情報をコマンドウィンドウに表示したい場合は、disp関数が便利です。前述の文字列操作コマンドと併用すると色々なことができます。
例えば次のように、時間のかかる計算をforループで繰り返す際、計算状況を確認しながら処理を実行することができます。
for num = 1 : 100 value = heavy_process(); % 何か重い処理があるとする disp([num2str(num) 'ループ目。現在の計算値:' num2str(value)]); end
1ループ目。現在の計算値:0.84147 2ループ目。現在の計算値:0.9093 3ループ目。現在の計算値:0.14112 ...
警告メッセージ/エラーメッセージ表示
warning関数/error関数を使うと、それぞれ警告メッセージ/エラーメッセージを表示させることができます。警告はコマンドウィンドウに警告メッセージが表示されるだけですが、エラーはその時点でプログラムが強制終了されます。
上の例と同様、時間のかかる計算中に計算の失敗をチェックする、といった用途に使えます。
for num = 1 : 100 value = heavy_process(); % 何か重い処理があるとする disp([num2str(num) 'ループ目。現在の計算値:' num2str(value)]); % エラー/警告メッセージを追加 if value < 0 error('計算値が負です。あり得ない結果です。計算に失敗しています。'); elseif value < 1 warning('計算値が1未満です。計算が不安定になっている可能性があります'); end end
関数の入力チェックにも使えますね。
% 文字列を受け取る関数 function give_me_string(str_in) if ~ischar(str_in) error('入力引数str_inは文字列である必要があります。'); end % 何かメインの処理 end
また、「エディタ」タブの「実行」ボタン下より、 警告/エラーが検出された時点で処理を一時停止し、デバッグモードに移行するよう設定できます。この機能と併用することで、より柔軟にプログラムの挙動を分析することが可能です。
plot
plot関係は数が多いため、別記事にてまとめています。
コメント