5
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

大学の卒業研究で使っているMATLABの基礎知識

僕は現在(2020年12月時点)大学4年生で、卒業研究をやっています。
自分の研究ではセンサーを使ってデータを取得し、それを数値解析する必要があります。
そこでMATLABを使っているのですが、非常に便利だな~と感じています。

その書き方や関数について、使っている中で学んだ基礎知識をまとめてみます。
「もっとこうした方がいいよ」等ありましたら、コメントでご教授いただけると嬉しいです。

基本

  • セミコロン
  • 出力
  • 計算
  • if
  • for

セミコロン

MATLABでは、終わりにセミコロンをつけます。

出力

disp という関数を使います。
使用例を以下に示します。

a = 10;
b = 'Hello world!';
disp(a); disp(b);

% 出力
% 10
% Hello world!

計算

自分が実際に使った基本的なものを挙げます。

  • 和:sum
  • 平均:mean
  • 絶対値:abs
  • 切り上げ:ceil
  • 切り捨て:floor

使用例を以下に示します。

a = [1 2 3]; b = -5; c = 3.2;
disp(sum(a));
disp(mean(a));
disp(abs(b));
disp(ceil(c));
disp(floor(c));

% 出力
% 6
% 2
% 5
% 4
% 3

if

if文の基本的な書き方は以下の通りです。
ある数値が正か負か0かを判定する例を示します。

num = 5;
if num > 0
    disp('正の数です。');
elseif num == 0
    disp('0です。');
else
    disp('負の数です。');
end

% 出力
% 正の数です。

for

for文の基本的な書き方は以下の通りです。
1から10までの数値を足す例を示します。

sum = 0;
for I = 1 : 10
    sum = sum + I;
end
disp(sum);

% 出力
% 55

ベストプラクティス

こちらの記事に全て書かれてあります。
[#matlab] Matlabのベスト・プラクティス

自分が気になったものだけ、以下に示します。

  • camelCaseで書く
  • 予約語とかぶらないように
  • スペース推奨

camelCaseで書く

「hogeData」や「HogeData」のように単語の先頭を大文字にしてつなげる表記方法のことです。

キャメルケース (camel case)とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

予約語と被らないように

当然のことですが、個人的に驚いたのが ij が予約語だったことです。
ij は虚数単位を表すようです。
以下に、公式ドキュメントから引用します。

i は関数なので、オーバーライドして変数として使うこともできます。ただし、複素数の計算に使用する場合は変数名に i および j を使用しないことを推奨します。

試してみたところ、例えばfor文のループで i を使うことはできたんですが、本やネット記事を見ても大文字の I を使っていることが多かったです。
複素数の計算ではないため問題ないとは思いますが、なんとなく気持ち悪いので僕もfor文のループでは大文字の I を使うようにしました。

スペース推奨

昨年やっていた先輩や先生のコードは、なぜかギュウギュウに詰めて書いていました。
「MATLABでは詰めて書くのかな」と思いましたが、そんなことはないようです。

グラフ関連

  • タイトル
  • 軸ラベル
  • 凡例

タイトル

title という関数を使います。
使用例を以下に示します。

title('検証結果');

軸ラベル

xlabelylabel という関数を使います。
それぞれ横軸・縦軸にラベルをつけることができます。
使用例を以下に示します。

% 横軸ラベル
xlabel('Frequency [Hz]');
% 縦軸ラベル
ylabel('Amplitude spectrum [kPa]');

凡例

legend という関数を使います。
使用例を以下に示します。

legend('従来手法', '提案手法1', '提案手法2');

その他の便利なもの

  • 複数行
  • 零行列
  • データの結合
  • ワークスペースからデータを取得
  • 関数ハンドル

複数行

3つのピリオド ... を使います。
使用例を以下に示します。

sum = 1 + 2 + 3 + 4 ...
        + 5 + 6 + 7 ...
        + 8 + 9 + 10;
disp(sum);

% 出力
% 55

零行列

零行列とは、成分が全て0の行列のことです。
zeros という関数を使います。
使用例を以下に示します。

a = zeros(2); % 2行2列
b = zeros(2, 3); % 2行3列
disp(a); disp(b);

% 出力
% 0 0
% 0 0
%
% 0 0 0
% 0 0 0

データの結合

  • 水平
  • 垂直

水平

horzcat という関数を使います。
使用例を以下に示します。

data1 = [1 2];
data2 = [3 4];
data = horzcat(data1, data2);
disp(data);

% 出力
% 1 2 3 4

垂直

vertcat という関数を使います。
使用例を以下に示します。

data1 = [1 2];
data2 = [3 4];
data = vertcat(data1, data2);
disp(data);

% 出力
% 1 2
% 3 4

ワークスペースからデータを取得

evalin という関数を使います。
第一引数は 'base' として、第二引数にワークスペースにあるデータの名前を与えます。
使用例を以下に示します。

data = evalin('base', 'data');

関数ハンドル

@ をつけることで関数ハンドルを作成できます。
以下、公式ドキュメントから引用します。

関数ハンドルは、関数への関連付けを格納する MATLAB® データ型です。関数を間接的に呼び出すことで、呼び出し位置によらずに関数を呼び出すことができます。

使用例を以下に示します。

function out = hogeFunction1(data)
    % 処理1
end

function out = hogeFunction2(data)
    % 処理2
end

% f = @hogeFunction1;
f = @hogeFunction2;

out = f(data);

データに対して関数を選択的に適用したいときに使いました。
使わないものは上記のようにコメントアウトしていました。

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
5
Help us understand the problem. What are the problem?