はい、承知いたしました。MATLABの初心者を対象とした、約5000語の詳細な解説記事を執筆します。
MATLAB の使い方がわからない?まずはこの記事をチェック!
MATLABを学びたいけれど、何から始めたら良いか分からない…。そんな悩みを抱えていませんか?大学の授業や研究、あるいは仕事でMATLABを使う必要が出てきたけれど、プログラミング経験がない、あるいはMATLABに触れるのが初めて、という方も少なくないでしょう。
安心してください。MATLABは強力なツールでありながら、初心者にとっても比較的とっつきやすいプログラミング環境です。この記事では、MATLABの基本の「き」から、データ解析や可視化、簡単なプログラミングまで、ステップバイステップで丁寧に解説していきます。この記事を読み終える頃には、MATLABの基本的な操作ができるようになり、自分で学びを進めるための土台がしっかりと築かれているはずです。
さあ、MATLABの世界への第一歩を踏み出しましょう!
1. はじめに:MATLABとは何か?なぜ学ぶのか?
1.1 MATLABとは?
MATLABは、「Matrix Laboratory」(行列研究所)に由来する名称を持つ、数値計算、データ解析、可視化、アルゴリズム開発のための高性能な技術計算言語および対話型の環境です。米国のMathWorks社によって開発・販売されています。
MATLABの大きな特徴は以下の通りです。
- 行列ベースの言語: 数値計算、特に線形代数演算を効率的に行えるように設計されています。これは、工学や科学技術分野で扱う多くの問題が、最終的に行列やベクトルを用いた計算に帰着することから非常に重要です。
- 豊富な組み込み関数: 数学、統計、信号処理、画像処理、制御工学など、様々な分野の計算に必要な関数が標準で多数用意されています。
- 優れた可視化機能: 2次元、3次元のグラフを簡単に作成・カスタマイズでき、データの特徴を直感的に理解するのに役立ちます。
- 対話型環境: コマンドウィンドウでコマンドを直接入力して結果をすぐに確認できるため、試行錯誤しながら開発を進めやすいです。
- ツールボックス: 特定の専門分野(例:機械学習、ディープラーニング、信号処理、制御システムなど)に特化した機能を追加する「ツールボックス」が豊富に用意されています。
- Simulinkとの連携: 動的システムのモデリング、シミュレーション、解析を行うためのグラフィカルな環境であるSimulinkと緊密に連携しています。
MATLABは、PythonやRといった他のプログラミング言語と同様に、科学技術計算の世界で広く使われています。
1.2 なぜMATLABを学ぶのか?
MATLABを学ぶメリットは多岐にわたりますが、主に以下のような点が挙げられます。
- 工学・科学技術分野での標準: 大学の研究室、企業の研究開発部門など、多くの現場で標準的なツールとして利用されています。これらの分野に進む方にとって、MATLABのスキルは必須、あるいは非常に有利になります。
- 直感的で分かりやすい: 行列やベクトルの操作が直感的に記述でき、複雑な数式も比較的容易にコードに落とし込めます。また、対話型環境は学習の初期段階で非常に役立ちます。
- 開発効率の高さ: 豊富な組み込み関数やツールボックスを活用することで、ゼロからコードを書くよりもはるかに短時間で目的の計算や解析を実現できます。特にプロトタイピングやアルゴリズム開発において威力を発揮します。
- 強力なサポートとドキュメント: MathWorks社による公式ドキュメントは非常に充実しており、ほとんどの疑問はドキュメントで解決できます。また、活発なユーザーコミュニティも存在します。
- データ解析・可視化の強力な機能: 収集したデータを読み込み、統計処理を行い、説得力のあるグラフを作成する一連の作業をスムーズに行えます。
もちろん、Pythonなど他の言語にもそれぞれ優れた点がありますが、特に制御工学、信号処理、画像処理、数値解析などの分野では、MATLABがデファクトスタンダードとなっている場面が多く見られます。
この記事は、MATLABの基本的な使い方、環境、コマンド、プログラミングの基礎を学びたい方を対象としています。これを読めば、自分で簡単な計算やデータ処理を行い、さらに高度な内容を学ぶための基礎力が身につきます。
2. MATLABの入手とインストール
MATLABを使い始めるには、まずソフトウェアを入手してコンピューターにインストールする必要があります。
2.1 ライセンスの種類
MATLABは商用ソフトウェアであり、利用にはライセンスが必要です。主なライセンスの種類は以下の通りです。
- 商用ライセンス: 企業などで業務に使用する場合のライセンスです。
- アカデミックライセンス: 大学などの教育・研究機関向けのライセンスです。多くの場合、大学がサイトライセンスを持っており、学生や教職員は無償または安価で利用できます。
- 学生ライセンス: 学生個人が学習目的で使用する場合のライセンスです。アカデミックライセンスがない大学の学生や、個人的に学びたい学生向けに比較的安価で提供されています。
- ホームユースライセンス: 個人が非商用目的(趣味など)で使用する場合のライセンスです。
まずは、所属する大学や会社がMATLABのライセンスを提供しているか確認しましょう。学生であれば、大学のWebサイトなどで「MATLAB ライセンス」と検索すると情報が見つかることが多いです。サイトライセンスがある場合は、その指示に従って入手・インストールするのが最も一般的です。
もし大学がライセンスを提供していない場合や、個人的に学びたい場合は、MathWorksのWebサイトから学生ライセンスやホームユースライセンスを購入できます。
2.2 MathWorksウェブサイトからのダウンロードとインストール
ここでは、MathWorksのWebサイトから個人でダウンロードする場合の一般的な手順を説明します。大学のサイトライセンスを利用する場合も、基本的な流れは似ています。
- MathWorksアカウントの作成: MathWorksのWebサイトにアクセスし、アカウントを作成します。大学のメールアドレスなど、正規のユーザーであることを証明できる情報が必要になる場合があります。
- ライセンスとの紐付け: 作成したアカウントに、購入した、あるいは大学から提供されたライセンスを紐付けます。ライセンスのアクティベーションキーなどが必要になります。
- MATLABインストーラーのダウンロード: アカウントにログインし、ライセンスが紐付けられていることを確認したら、ダウンロードページからご自身のOS(Windows, macOS, Linux)に合ったMATLABインストーラーをダウンロードします。
- インストーラーの実行: ダウンロードしたファイルを実行します。管理者権限が必要になる場合があります。
- ライセンス契約への同意: 利用規約を確認し、同意します。
- MathWorksアカウントでのログイン: インストールを進めるために、作成したMathWorksアカウントでログインします。これにより、紐付けられたライセンスが認識されます。
- ライセンスの選択: 使用するライセンスを選択します。通常、自動的に候補が表示されます。
- インストール先の指定: MATLABをインストールするフォルダを指定します。特別な理由がなければデフォルトのままで構いません。
- コンポーネントの選択: インストールするMATLABのバージョンと、追加したいツールボックスを選択します。最初はMATLAB本体(必須)と、必要に応じていくつかの基本的なツールボックス(例: Optimization Toolbox, Symbolic Math Toolboxなど、授業や目的に合わせて)を選択すれば十分です。全てのツールボックスをインストールすると容量が大きくなるので注意が必要です。後からいつでも追加インストールできます。
- インストールの実行: 選択内容を確認し、インストールを開始します。インターネット接続が必要です。インストールには時間がかかる場合があります。
- インストールの完了: インストールが完了したら、MATLABを起動するためのアイコンがデスクトップやアプリケーションフォルダに作成されます。
2.3 初回起動時の確認
インストール後、初めてMATLABを起動すると、ライセンスのアクティベーションが求められることがあります。画面の指示に従ってライセンスをアクティベートすれば、MATLABが使用可能になります。
無事にMATLABのウィンドウが表示されれば、インストールは成功です!
3. MATLABの基本画面とインターフェース
MATLABを起動すると、通常、いくつかのウィンドウが組み合わさったデスクトップ環境が表示されます。これらのウィンドウは、MATLABでの作業効率を高めるために重要な役割を果たします。
基本的なデフォルトのレイアウトは以下のようになっています。
-
コマンドウィンドウ (Command Window):
- MATLAB環境の中心となるウィンドウです。
>>というプロンプトが表示されており、ここにMATLABのコマンドを直接入力して実行できます。- 簡単な計算や、一度だけ実行するような処理、関数の挙動確認などに使います。
- コマンドを入力してEnterキーを押すと、すぐに結果が表示されます。
-
ワークスペース (Workspace):
- 現在MATLABのメモリ上に存在している変数とその情報を表示するウィンドウです。
- 変数名、その値、データ型、サイズなどが一覧で確認できます。
- 変数名をダブルクリックすると、変数エディターで変数の中身を詳細に確認・編集できます(特に配列やテーブルなどで便利です)。
- ワークスペースの変数は、MATLABを終了するとデフォルトでは消去されます。
-
カレントフォルダ (Current Folder):
- MATLABが現在作業ディレクトリとして認識しているフォルダを表示するウィンドウです。
- MATLABは、このカレントフォルダにあるMファイル(MATLABのスクリプトや関数ファイル)やデータファイルを特別なパス設定なしに認識できます。
- ここでファイルを開いたり、新規作成したり、管理したりできます。
- ツールバーのドロップダウンメニューやブラウズボタンを使って、カレントフォルダを変更できます。
-
コマンド履歴 (Command History):
- コマンドウィンドウで過去に入力・実行したコマンドの履歴が表示されるウィンドウです。
- 過去のコマンドを選択して再実行したり、コピー&ペーストしたりできます。
- コマンドウィンドウで上矢印キー(↑)や下矢印キー(↓)を押すことでも、コマンド履歴を遡ったり進んだりできます。
-
エディター (Editor):
- MATLABのスクリプトや関数(Mファイル)を作成・編集するためのウィンドウです。
- 複数のコマンドをまとめて記述し、ファイルとして保存しておき、いつでも繰り返し実行できます。
- シンタックスハイライト、コード補完、インデント、デバッグ機能などが備わっています。
- 通常、コマンドウィンドウで
editコマンドを入力するか、新規スクリプトボタンをクリックして開きます。
レイアウトのカスタマイズ:
これらのウィンドウの配置は自由に変更できます。「レイアウト」タブや各ウィンドウのタイトルバーを右クリックすることで、ウィンドウの表示/非表示、ドッキング/アンドッキング、配置などをカスタマイズできます。自分にとって使いやすいレイアウトに調整してみましょう。
4. 基本的な操作とコマンド
まずは、MATLABのコマンドウィンドウを使って、簡単な計算や変数の扱い方を学んでみましょう。
4.1 コマンドウィンドウでの計算
コマンドウィンドウのプロンプト >> の横に、計算式を直接入力してEnterキーを押すと、計算結果が表示されます。
“`matlab
2 + 3
ans =
510 / 2.5
ans =
4.0000(5 – 2) * 4
ans =
122^3 % 2の3乗
ans =
8
“`
- 四則演算は
+,-,*,/を使います。 - 冪乗(べきじょう)は
^を使います。 - 小数点以下の計算も可能です。
%記号はコメントです。その行の%より後ろはMATLABに無視されます。コードの説明などを書くのに使います。
計算結果が変数 ans に自動的に代入されています。ans は “answer” の略で、変数に明示的に代入しなかった直前の計算結果が格納されます。
4.2 変数の使い方
計算結果を変数に格納しておくと、後でその値を利用したり、操作したりできます。変数名の付け方にはいくつかのルールがありますが、基本的には英数字とアンダースコア (_) を使い、英字で始めるのが一般的です(大文字と小文字は区別されます)。
“`matlab
x = 5
x =
5y = 3 * x
y =
15z = x + y / 2
z =
12.5000
“`
変数 x に 5 を代入し、y に 3 * x の結果を代入し、z に x + y / 2 の結果を代入しています。コマンドの最後にセミコロン ; をつけると、結果が表示されずに変数に代入だけが行われます。
“`matlab
a = 10; % 結果を表示しない
b = 20;
c = a + b % 結果を表示する
c =
30
“`
ワークスペースウィンドウを見ると、作成した変数 (x, y, z, a, b, c, ans) が一覧表示されているはずです。
変数をクリアするには、clear コマンドを使います。特定の変数だけクリアすることも、全ての変数をクリアすることもできます。
“`matlab
clear y % 変数 y だけクリア
clear % 全ての変数をクリア
“`
ワークスペースウィンドウを確認すると、変数が消えていることが分かります。
4.3 基本的なデータ型(数値: スカラー、ベクトル、行列)
MATLABは行列ベースの言語なので、数値データは基本的に「配列」として扱われます。最も単純な配列は1つの数値を持つ「スカラー」(1×1の配列)です。これまでに扱ってきた x, y, z などはスカラー変数です。
次に、複数の数値を1次元に並べた「ベクトル」があります。ベクトルには「行ベクトル」と「列ベクトル」があります。
-
行ベクトル: カンマ
,またはスペースで要素を区切り、角括弧[]で囲みます。
“`matlab
>> row_vec = [1, 2, 3, 4, 5]
row_vec =
1 2 3 4 5another_row_vec = [6 7 8 9 10] % スペースでもOK
another_row_vec =
6 7 8 9 10
* **列ベクトル**: セミコロン `;` で要素を区切り、角括弧 `[]` で囲みます。matlab
col_vec = [1; 2; 3; 4; 5]
col_vec =
1
2
3
4
5
“`
複数の行と列を持つ「行列」は、行ごとに要素をカンマやスペースで区切り、行間をセミコロンで区切って角括弧 [] で囲みます。
“`matlab
my_matrix = [1 2 3; 4 5 6; 7 8 9]
my_matrix =
1 2 3
4 5 6
7 8 9
“`
これは3行3列の行列です。
配列の作成(便利な方法):
-
等間隔なベクトル:
start:step:endの形式で、startからendまでstep刻みのベクトルを作成できます。stepを省略すると1刻みになります。
“`matlab
>> vec1 = 1:5 % 1から5までの1刻み
vec1 =
1 2 3 4 5vec2 = 0:2:10 % 0から10までの2刻み
vec2 =
0 2 4 6 8 10vec3 = 5:-1:1 % 5から1までの-1刻み
vec3 =
5 4 3 2 1
* **指定した要素数の等間隔ベクトル**: `linspace(start, end, n)` で、`start` から `end` までの区間を `n` 個の等間隔な要素で分割したベクトルを作成します。matlab
vec4 = linspace(0, 10, 5) % 0から10までを5分割(両端含む)
vec4 =
0 2.5000 5.0000 7.5000 10.0000
“`
配列の要素アクセス:
配列の特定の要素にアクセスするには、丸括弧 () を使い、要素のインデックス(添え字)を指定します。MATLABのインデックスは 1 から始まります(0から始まる言語に慣れている方は注意が必要です)。
“`matlab
row_vec = [10 20 30 40 50];
row_vec(3) % 3番目の要素にアクセス
ans =
30col_vec = [1; 2; 3; 4; 5];
col_vec(1) % 1番目の要素にアクセス
ans =
1my_matrix = [1 2 3; 4 5 6; 7 8 9];
my_matrix(2, 3) % 2行3列目の要素にアクセス
ans =
6
“`
コロン : は、特定の行や列の全ての要素、あるいは連続した要素を指定するのに使われます。
“`matlab
row_vec(2:4) % 2番目から4番目までの要素
ans =
20 30 40my_matrix(1, 🙂 % 1行目の全ての要素
ans =
1 2 3my_matrix(:, 2) % 2列目の全ての要素 (列ベクトルになる)
ans =
2
5
8my_matrix(1:2, 2:3) % 1-2行目、2-3列目の部分行列
ans =
2 3
5 6
“`
end キーワードを使うと、最後の要素のインデックスを指定できます。
“`matlab
row_vec(end) % 最後の要素
ans =
50my_matrix(end, end) % 右下の要素
ans =
9my_matrix(1:end, 1) % 1列目の全ての要素
ans =
1
4
7
“`
4.4 組み込み関数
MATLABには、数学、統計、工学分野などでよく使う計算を行うための「組み込み関数」が多数用意されています。関数を使うには、関数名の後に丸括弧 () をつけ、その中に引数(入力値)を指定します。
“`matlab
sin(pi/2) % sin(π/2) の計算
ans =
1.0000cos(0) % cos(0) の計算
ans =
1.0000sqrt(16) % 16の平方根
ans =
4exp(1) % e^1 の計算 (ネイピア数 e)
ans =
2.7183log(exp(1)) % 自然対数 (ln(e))
ans =
1.0000log10(100) % 常用対数 (log_10(100))
ans =
2abs(-5) % 絶対値
ans =
5round(3.7) % 四捨五入
ans =
4floor(3.7) % 小数点以下切り捨て
ans =
3ceil(3.2) % 小数点以下切り上げ
ans =
4
“`
ベクトルや行列を関数に与えると、要素ごとに計算を行ってくれる関数が多くあります(これを「要素ごとの操作」と呼びます)。
“`matlab
angles = [0, pi/2, pi];
sin(angles)
ans =
0.0000 1.0000 0.0000
“`
統計関数も便利です。
“`matlab
data = [1 2 3 4 5];
sum(data) % 合計
ans =
15mean(data) % 平均値
ans =
3max(data) % 最大値
ans =
5min(data) % 最小値
ans =
1
“`
これらの関数は、行列に対しても同様に使えます。
“`matlab
my_matrix = [1 2 3; 4 5 6; 7 8 9];
sum(my_matrix) % 列ごとの合計 (行ベクトルになる)
ans =
12 15 18sum(my_matrix, 2) % 行ごとの合計 (列ベクトルになる)
ans =
6
15
24
``sum関数の第2引数2` は、合計を計算する次元を指定しています(1は列方向、2は行方向)。
4.5 ヘルプ機能の使い方
MATLABには非常に充実したヘルプドキュメントが用意されています。使い方を知りたい関数やコマンドがあれば、ヘルプ機能を活用しましょう。
helpコマンド: コマンドウィンドウでhelp 関数名と入力すると、簡単な説明が表示されます。
matlab
>> help plot
PLOT Linear 2-D plot.
PLOT(X,Y) plots vector Y versus vector X. If X is a matrix and Y is a
vector, or vice versa, the matrix or vector with length...
... (以下、説明が続く)-
docコマンド: コマンドウィンドウでdoc 関数名と入力すると、MATLABのヘルプブラウザが開いて、その関数の詳細なドキュメントが表示されます。こちらの方が情報の量が多く、例題なども含まれていて非常に役立ちます。
matlab
>> doc sin
(新しいウィンドウでsin関数のドキュメントが開く) -
ヘルプブラウザ: デスクトップの上部にある「ヘルプ」メニューからもヘルプブラウザを開けます。キーワード検索や目次から調べたい内容を探すことができます。
分からないことがあれば、まず doc コマンドを使う癖をつけましょう。
5. スクリプト(Mファイル)の作成と実行
簡単なコマンドならコマンドウィンドウで十分ですが、複数のコマンドを連続して実行したい場合や、同じ処理を繰り返し行いたい場合は、スクリプトを作成するのが効率的です。MATLABのスクリプトは「Mファイル」と呼ばれ、拡張子は .m です。
5.1 なぜスクリプトを使うのか?
- 繰り返し実行: 一連の処理をファイルに保存しておけば、いつでも簡単に繰り返し実行できます。
- 編集と修正: コマンドウィンドウの履歴を遡って修正するのは大変ですが、エディターでスクリプトを修正するのは容易です。
- 複雑な処理: 多数の変数を使った複雑な計算や、制御構造(後述)を含む処理は、スクリプトで記述する方が分かりやすく、管理しやすいです。
- 共有と再利用: 作成したスクリプトは他の人と共有したり、別のプログラムの一部として利用したりできます。
5.2 エディターでのスクリプト作成
MATLABのデスクトップ上部のツールバーにある「新規」ボタンから「スクリプト」を選択するか、コマンドウィンドウで edit コマンドを入力すると、エディターウィンドウが開きます。
“`matlab
% my_first_script.m
% これはコメントです。
% このスクリプトは簡単な計算を行います。
% 変数を定義
a = 10;
b = 20;
% 計算を行う
c = a + b;
d = a * b;
% 結果を表示
disp(‘Calculation Results:’); % 文字列を表示
disp([‘a + b = ‘, num2str(c)]); % 変数cの値を文字列に変換して表示
disp([‘a * b = ‘, num2str(d)]); % 変数dの値を文字列に変換して表示
% 簡単なプロット(もし時間があれば)
x = linspace(0, 2*pi, 100); % 0から2πまで100点のベクトル
y = sin(x);
plot(x, y); % y vs x のグラフをプロット
title(‘Sine Wave’); % グラフタイトル
xlabel(‘x [rad]’); % x軸ラベル
ylabel(‘sin(x)’); % y軸ラベル
grid on; % グリッド表示
“`
上記のように、エディターにMATLABのコマンドを記述していきます。
%はコメント行です。コードの説明や一時的な無効化に使います。disp()関数は、括弧内の内容をコマンドウィンドウに表示します。変数の中身を表示したり、処理の途中経過を確認したりするのに便利です。num2str()関数は、数値を文字列に変換します。disp()などで文字列と数値を組み合わせて表示したい場合に使います。[]とカンマ,を使って文字列を連結できます。
スクリプトを書き終えたら、ファイルとして保存します。エディターの「保存」ボタンをクリックし、適当なファイル名(例: my_first_script.m)を付けて、カレントフォルダに保存します。ファイル名は英字で始め、MATLABの予約語(if, for, end など)と同じ名前は避けてください。
5.3 スクリプトの実行
保存したスクリプトを実行する方法はいくつかあります。
- エディターの「実行」ボタン: エディターウィンドウの上部にある緑色の「実行」ボタンをクリックするのが最も簡単です。
- コマンドウィンドウからファイル名を入力: スクリプトがカレントフォルダにある場合、コマンドウィンドウでファイル名(拡張子
.mなし)を入力してEnterキーを押すと実行されます。
matlab
>> my_first_script
Calculation Results:
a + b = 30
a * b = 200
(グラフも表示される) - F5キー: エディターでスクリプトを開いている状態でF5キーを押すと実行されます。
スクリプトが実行されると、そこに書かれたコマンドが上から順番に実行され、結果がコマンドウィンドウに表示されたり、グラフが表示されたりします。
5.4 エラーメッセージとデバッグの基本
スクリプトを書く上で、エラーはつきものです。エラーメッセージが表示されても慌てず、内容をよく読んで原因を探りましょう。
MATLABのエラーメッセージは、通常、エラーの種類と、そのエラーが発生したファイル名、行番号を示してくれます。
例: タイプミスによるエラー
“`matlab
% error_example.m
x = 10;
y = 20;
z = x + y; % ここまではOK
plot(z) % 間違った関数名 “plt” と入力したとする
% 正しいコード
% plot(z)
“`
このスクリプトを実行すると、コマンドウィンドウに以下のようなエラーメッセージが表示されます。
“`
Undefined function or variable ‘plt’.
Error in error_example (line 5)
plot(z)
``plt
このメッセージは、という関数や変数が定義されていない、と言っています。そして、エラーはerror_example.mというファイルの **5行目** で発生していることを教えてくれています。この情報を見れば、5行目のplot(z)` が間違っていることに気づけます。
エラーが発生したら、
- エラーメッセージを注意深く読む。
- メッセージが示すファイル名と行番号を確認し、その場所のコードを見る。
- メッセージの内容から、原因(スペルミス、変数の未定義、関数の使い間違いなど)を特定する。
- コードを修正して再度実行する。
というステップで対処します。デバッグについては後ほど詳しく解説します。
6. 行列と配列の操作(詳細)
MATLABの強みは、ベクトルや行列といった配列を効率的に扱える点にあります。ここでは、より進んだ配列の作成と操作方法を見ていきましょう。
6.1 特殊な行列の生成
特定のパターンの行列を生成するための便利な関数があります。
zeros(m, n): 全ての要素が0のm行n列の行列を作成します。引数が1つ (zeros(n)) の場合はn行n列の正方行列になります。
matlab
>> zeros(2, 3)
ans =
0 0 0
0 0 0ones(m, n): 全ての要素が1のm行n列の行列を作成します。
matlab
>> ones(3)
ans =
1 1 1
1 1 1
1 1 1eye(n):n行n列の単位行列(対角要素が1で他が0の正方行列)を作成します。
matlab
>> eye(4)
ans =
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1rand(m, n): 0から1までの一様乱数を持つm行n列の行列を作成します。
matlab
>> rand(2, 2)
ans =
0.8147 0.1270
0.9058 0.9134randn(m, n): 平均0、標準偏差1の正規分布に従う乱数を持つm行n列の行列を作成します。
matlab
>> randn(1, 5)
ans =
-0.4326 -1.6656 0.1253 0.2877 1.1909
6.2 行列演算と要素ごとの演算
MATLABでは、同じサイズの配列同士の算術演算(+, -, *, /, ^)は、デフォルトでは「行列演算」として解釈されます。一方で、要素ごとの演算を行いたい場合は、演算子の前にドット . をつけます。
例: 行列の定義
“`matlab
A = [1 2; 3 4];
B = [5 6; 7 8];
“`
-
加算・減算: 同じサイズの行列同士で要素ごとに行われます。ドットは不要です。
“`matlab
>> A + B
ans =
6 8
10 12A – B
ans =
-4 -4
-4 -4
* **行列乗算**: 標準的な行列の積を計算します。左の行列の列数と右の行列の行数が一致している必要があります。ドットは不要です。matlab
A * B
ans =
19 22
43 50
* **要素ごとの乗算**: 同じサイズの行列やベクトル同士で、対応する要素をそれぞれ掛け合わせます。演算子 `*` の前にドット `.` をつけます。matlab
A .* B
ans =
5 12
21 32
* **行列除算**: 行列の除算は通常、逆行列を用いた線形方程式の解法として行われます(詳細は後述)。matlab
* **要素ごとの除算**: 同じサイズの行列やベクトル同士で、対応する要素をそれぞれ割り算します。演算子 `/` の前にドット `.` をつけます。
A ./ B
ans =
0.2000 0.3333
0.4286 0.5000
* **行列の冪乗**: 行列 `A` を `n` 回かける `A^n` を計算します(`A` は正方行列である必要があります)。matlab
A^2 % A * A と同じ
ans =
7 10
15 22
* **要素ごとの冪乗**: 各要素をそれぞれ指定された回数だけ冪乗します。演算子 `^` の前にドット `.` をつけます。matlab
A.^2 % 各要素を2乗する
ans =
1 4
9 16
“`
要素ごとの演算子の重要性:
特にベクトル同士の計算や、ベクトル・行列とスカラーの計算では、要素ごとの演算子(.+, .-, .*, ./, .^)が非常に頻繁に使われます。例えば、関数の値をプロットするために x ベクトルに対応する y の値を計算する場合などです。
“`matlab
x = 0:pi/10:2*pi; % 0から2πまでpi/10刻みのベクトル
y = sin(x); % sin関数は要素ごとに計算されるのでドットは不要y_squared = sin(x).^2; % sin(x)の各要素を2乗する場合はドットが必要
``sin
多くの組み込み関数(,cos,exp,logなど)は、入力が配列の場合、自動的に要素ごとに計算を行います。しかし、*,/,^` といった算術演算子を使う場合は、行列演算と要素ごとの演算を明確に区別する必要があります。
6.3 転置
行列やベクトルの行と列を入れ替える操作を「転置」と呼びます。MATLABでは、アポストロフィ ' またはドットとアポストロフィ .' を使います。
“`matlab
row_vec = [1 2 3];
col_vec = row_vec’ % 行ベクトルを列ベクトルに転置
col_vec =
1
2
3my_matrix = [1 2; 3 4];
my_matrix’ % 行列を転置
ans =
1 3
2 4
``‘
アポストロフィは共役転置(複素数の場合に要素の共役を取ってから転置)を行います。実数の場合は.なしの‘と.’は同じ結果になりますが、複素数を扱う場合は.をつけるかどうかで結果が変わるので注意が必要です。実数しか扱わない場合はどちらを使っても問題ありませんが、一貫性のために. ‘` を使う人もいます。
6.4 逆行列と行列式
正方行列の逆行列や行列式を計算する関数も用意されています。
-
inv(A): 行列Aの逆行列を計算します。A * inv(A)は単位行列になります。
“`matlab
>> A = [1 2; 3 4];
>> inv(A)
ans =
-2.0000 1.0000
1.5000 -0.5000A * inv(A) % 確認
ans =
1.0000 0.0000
0.0000 1.0000 % 浮動小数点演算誤差で微小な値になることがある
* **`det(A)`**: 行列 `A` の行列式を計算します。行列式が0の場合、その行列は正則(逆行列を持つ)ではありません。matlab
det(A)
ans =
-2.0000
“`
6.5 線形方程式の解法
MATLABでは、連立一次方程式 Ax = b の解 x を求めるのに、逆行列を使うよりも効率的で数値的に安定な「左除算」演算子 \ を使うのが推奨されます。
“`matlab
% 例: 2x + 3y = 7, x – y = 1 を解く
% これを行列で表すと [2 3; 1 -1] * [x; y] = [7; 1] となる
A = [2 3; 1 -1];
b = [7; 1]; % 列ベクトルにするx = A \ b % 左除算演算子
x =
2.0000
1.0000
``x=2, y=1
解はと求まりました。x = inv(A) * bと計算しても同じ結果が得られますが、計算量が多く、数値誤差も大きくなる可能性があるため、` 演算子を使うのが一般的です。
6.6 配列の連結
既存の配列を結合して新しい配列を作成することもよくあります。
-
水平方向の連結 (横に並べる): カンマ
,またはスペースで区切って角括弧で囲みます。
“`matlab
>> v1 = [1 2];
>> v2 = [3 4];
>> h_cat = [v1, v2]
h_cat =
1 2 3 4M1 = [1 2; 3 4];
M2 = [5 6; 7 8];
horz_cat = [M1, M2] % 列数が同じである必要がある
horz_cat =
1 2 5 6
3 4 7 8
* **垂直方向の連結 (縦に並べる)**: セミコロン `;` で区切って角括弧で囲みます。matlab
v3 = [1; 2];
v4 = [3; 4];
v_cat = [v3; v4]
v_cat =
1
2
3
4M1 = [1 2; 3 4];
M3 = [9 8];
vert_cat = [M1; M3] % 行数が同じである必要がある
vert_cat =
1 2
3 4
9 8
``horzcat
関数やvertcat` も同じ目的で使用できますが、角括弧を使うのがより一般的です。
6.7 配列のサイズ、長さ
配列のサイズ(行数、列数)や要素数を取得する関数はデータ処理で非常に重要です。
-
size(A): 配列Aの行数と列数を返します。
“`matlab
>> M = rand(3, 4);
>> size(M)
ans =
3 4[rows, cols] = size(M); % 複数の出力引数を受け取る
rows
rows =
3
cols
cols =
4
`size(A, dim)` の形式で、特定の次元(1は行、2は列)のサイズだけを取得することもできます。matlab
size(M, 1) % 行数
ans =
3
size(M, 2) % 列数
ans =
4
* **`length(v)`**: ベクトル `v` の要素数を返します。行列に対して使うと、行数と列数の大きい方の値を返します。通常、ベクトルに対してのみ使用します。matlab
v = 1:10;
length(v)
ans =
10length(M) % size(M, 1)とsize(M, 2)のうち大きい方 (max(3, 4)=4)
ans =
4
* **`numel(A)`**: 配列 `A` の全要素数を返します。matlab
numel(M) % 3行 * 4列 = 12要素
ans =
12
“`
6.8 論理インデックス
MATLABでは、論理値(trueまたはfalse)の配列を使って、別の配列の要素にアクセスしたり、要素を抽出したりすることができます。これは非常に強力で、特定の条件を満たす要素だけを効率的に処理するのに役立ちます。
比較演算子 (== (等しい), ~= (等しくない), > (より大きい), < (より小さい), >= (以上), <= (以下)) は、要素ごとに論理値の配列を返します。
“`matlab
data = [10, -5, 0, 15, -20, 5];
data > 0 % 要素が0より大きいかどうかを判定
ans =
1×6 logical array
1 0 0 1 0 1 % trueを1, falseを0で表示
``true` に対応する要素だけが抽出されます。
この論理値の配列を、元の配列のインデックスとして使用すると、
“`matlab
positive_values = data(data > 0) % 論理インデックスを使って正の値だけを抽出
positive_values =
10 15 5negative_values = data(data < 0) % 負の値だけを抽出
negative_values =
-5 -20
“`
論理インデックスは、要素の変更にも使えます。
“`matlab
data(data < 0) = 0 % 負の値を全て0に置き換える
data =
10 0 0 15 0 5
“`
これは、ループ処理を使わずに配列の要素を効率的に操作するMATLABらしい記述方法です。
7. データのインポートとエクスポート
外部ファイルからデータを読み込んだり、計算結果をファイルに保存したりすることは、MATLABを使ったデータ解析の一般的なワークフローです。
7.1 テキストファイル (.txt, .csv) の読み込み
カンマ区切り値 (CSV) ファイルやタブ区切りテキストファイルは、広く使われているデータ形式です。
-
readtable(filename): 区切り形式のテキストファイルから、データを行列ではなく「テーブル」として読み込みます。ヘッダー行がある場合や、数値以外のデータ(文字列など)が含まれる場合に便利です。
“`matlab
% ‘my_data.csv’ というファイルがあり、
% Name,Age,Score
% Alice,25,85
% Bob,30,92
% Charlie,22,78
% のような内容だと仮定する
>> data_table = readtable(‘my_data.csv’)
data_table =
3×3 table
Name Age Score
_ ___ __
‘Alice’ 25 85
‘Bob’ 30 92
‘Charlie’ 22 78data_table.Age % テーブルの列(変数)にアクセス
ans =
25
30
22data_table{2, ‘Score’} % 2行目の’Score’列の値にアクセス (セルの内容)
ans =
92
* **`readmatrix(filename)`**: 区切り形式のテキストファイルから、数値データだけを自動的に検出し、行列として読み込みます。ファイルに数値以外のデータが含まれている場合は、それらの列は無視されるか、エラーになる可能性があります。matlab
% ‘numeric_data.txt’ というファイルがあり、
% 1 2 3
% 4 5 6
% 7 8 9
% のような内容だと仮定する
data_matrix = readmatrix(‘numeric_data.txt’)
data_matrix =
1 2 3
4 5 6
7 8 9
``csvread(filename)
* **/dlmread(filename, delimiter)**: 古い関数ですが、まだ使われることがあります。csvreadはカンマ区切り、dlmreadは指定した区切り文字(例: タブの場合は‘\t’)で区切られた数値データを読み込みます。これらの関数は、数値データのみのファイルにしか使えません。また、readtableやreadmatrixよりも機能が少ないです。新規コードではreadtableやreadmatrix` を使うのが推奨されます。
7.2 Excelファイル (.xls, .xlsx) の読み込み
Excelファイルも直接読み込めます。
readtable(filename, sheet): Excelファイルから指定したシートをテーブルとして読み込みます。
matlab
% 'my_excel_data.xlsx' ファイルの 'Sheet1' を読み込む
>> excel_data_table = readtable('my_excel_data.xlsx', 'Sheet', 'Sheet1')readmatrix(filename, sheet): Excelファイルから指定したシートの数値データを行列として読み込みます。
matlab
>> excel_data_matrix = readmatrix('my_excel_data.xlsx', 'Sheet', 'Sheet1')xlsread(filename, sheet): 古い関数ですが、Excelファイルを読み込むことができます。データを数値行列、文字列のセル内容、生のセル内容の3つの出力として返すことができます。新規コードではreadtableやreadmatrixの方が推奨されます。
7.3 MATファイル (.mat) の読み込みと保存
MATファイルは、MATLAB専用のデータ保存形式です。MATLABのワークスペース上の変数(数値配列、テーブル、構造体、セル配列など、MATLABで扱えるほぼ全てのデータ型)を、その名前や型などの情報と共に効率的に保存・読み込みできます。これはMATLAB間でデータをやり取りするのに最も便利な方法です。
-
save(filename, variables): ワークスペース上の指定した変数、または全ての変数をMATファイルに保存します。
“`matlab
>> x = 1:10;
>> M = rand(3, 3);
>> save(‘my_workspace_data.mat’, ‘x’, ‘M’); % 変数xとMを保存save(‘all_variables.mat’); % ワークスペースの全ての変数を保存
* **`load(filename, variables)`**: MATファイルに保存された指定した変数、または全ての変数をワークスペースに読み込みます。matlab
clear % ワークスペースを一度クリアload(‘my_workspace_data.mat’); % my_workspace_data.mat から変数xとMを読み込む
% ワークスペースに x と M が表示されるはずですload(‘all_variables.mat’); % all_variables.mat から全ての変数を読み込む
``save(‘filename’)
ファイル名だけを指定した場合 (,load(‘filename’)) は、拡張子.mat` が自動的に付加されます。
7.4 データの保存(テキスト、Excel)
計算結果や生成したデータをファイルに保存する方法です。
writetable(table, filename): テーブルをテキストファイル(CSVなど)やExcelファイルとして保存します。
matlab
>> data_table = table([1; 2; 3], {'A'; 'B'; 'C'}, [100; 200; 300], 'VariableNames', {'ID', 'Category', 'Value'});
>> writetable(data_table, 'output_data.csv'); % CSVファイルとして保存
>> writetable(data_table, 'output_data.xlsx', 'Sheet', 'Results'); % Excelファイルの'Results'シートに保存writematrix(matrix, filename): 数値行列をテキストファイルとして保存します。
matlab
>> result_matrix = [1.1 2.2; 3.3 4.4];
>> writematrix(result_matrix, 'result.txt'); % タブ区切りで保存
>> writematrix(result_matrix, 'result.csv'); % カンマ区切りで保存csvwrite(filename, matrix)/dlmwrite(filename, matrix, delimiter): 古い関数ですが、数値行列をテキストファイルに保存できます。csvwriteはカンマ区切り、dlmwriteは指定した区切り文字で保存します。新規コードではwritematrixを使うのが推奨されます。
これらの入出力関数を使うことで、MATLABでの解析結果を他のソフトウェアで利用したり、外部データを取り込んで解析を行ったりすることが可能になります。
8. 基本的なプロット(可視化)
MATLABの強力な機能の一つが、データの可視化です。様々な種類のグラフを簡単に作成し、カスタマイズできます。
8.1 2次元プロット (plot)
最も基本的なプロット関数は plot です。
-
基本的な使い方:
plot(y)とすると、yの要素を縦軸に、そのインデックス(1, 2, 3…)を横軸にプロットします。plot(x, y)とすると、ベクトルyをベクトルxに対してプロットします。xとyは同じ長さである必要があります。
matlab
>> x = linspace(0, 2*pi, 100); % 0から2πまで100点のベクトル
>> y = sin(x);
>> plot(x, y); % sin波をプロット
このコマンドを実行すると、新しいウィンドウ(フィギュアウィンドウ)が開いてグラフが表示されます。 -
線のスタイル、色、マーカーの指定:
plot(x, y, 'オプション文字列')の形式で、線のスタイル、色、マーカーを組み合わせて指定できます。- 線のスタイル:
-(実線),--(破線),:(点線),-.(一点鎖線) - 色:
r(赤),g(緑),b(青),k(黒),m(マゼンタ),c(シアン),y(黄色),w(白) - マーカー:
.(点),o(丸),x(バツ),+(プラス),*(アスタリスク),s(四角),d(ひし形),^(上向き三角),v(下向き三角),<(左向き三角),>(右向き三角),p(五角形),h(六角形)
“`matlabx = 1:10;
y = x.^2;
plot(x, y, ‘ro–‘); % 赤色の丸マーカー付き破線でプロット
“`
- 線のスタイル:
-
複数のデータを一つのグラフにプロット: 同じ
plotコマンドに複数のx, yペアを指定するか、hold onコマンドを使います。
“`matlab
>> x = linspace(0, 2*pi, 100);
>> y1 = sin(x);
>> y2 = cos(x);% 方法1: plotコマンドに複数ペア指定
plot(x, y1, ‘b-‘, x, y2, ‘r–‘);
% 方法2: hold on/off を使う
plot(x, y1, ‘b-‘); % 最初のプロット
hold on; % 次のプロットを重ね書きする設定
plot(x, y2, ‘r–‘); % 2つ目のプロット
hold off; % 重ね書きを解除 (新しいplotは新しいフィギュアに描かれるようになる)
“` -
タイトル、ラベル、凡例の追加: グラフの説明情報を加えるのは必須です。
“`matlab
>> x = linspace(0, 2*pi, 100);
>> y1 = sin(x);
>> y2 = cos(x);
>> plot(x, y1, ‘b-‘, x, y2, ‘r–‘);title(‘Sine and Cosine Waves’); % グラフのタイトル
xlabel(‘Angle [rad]’); % x軸のラベル
ylabel(‘Amplitude’); % y軸のラベル
legend(‘sin(x)’, ‘cos(x)’); % 凡例 (plotコマンドで指定した順番に対応)
“` -
軸の範囲設定:
xlimとylimで軸の表示範囲を調整できます。
matlab
>> xlim([0, 2*pi]); % x軸の範囲を0から2πに設定
>> ylim([-1.5, 1.5]); % y軸の範囲を-1.5から1.5に設定 -
グリッド表示:
grid onでグラフにグリッド線を表示します。非表示にするにはgrid offです。
matlab
>> grid on; -
フィギュアと軸:
figureコマンドを使うと、新しいフィギュアウィンドウを作成してそこにプロットできます。figure(n)とすると、番号nのフィギュアを選択(なければ作成)できます。
“`matlab
>> plot(x, y1); % 最初のフィギュアにプロットされるfigure; % 新しいフィギュアを作成して選択状態にする
plot(x, y2); % 新しいフィギュアにプロットされるfigure(1); % 1番目のフィギュアを選択
hold on;
plot(x, y2, ‘r–‘); % 1番目のフィギュアに重ね書き
``axesコマンドを使うと、一つのフィギュアウィンドウ内に複数のプロット領域を作成できます(後述のsubplot` がより一般的です)。
8.2 3次元プロット
3次元のデータをプロットするための関数もいくつかあります。
-
plot3(x, y, z): 3次元空間内の点の軌跡をプロットします。x,y,zは同じ長さのベクトルである必要があります。
matlab
>> t = 0:pi/50:10*pi; % 時間ベクトル
>> x = sin(t);
>> y = cos(t);
>> z = t;
>> plot3(x, y, z); % 螺旋をプロット
>> title('3D Spiral');
>> xlabel('x');
>> ylabel('y');
>> zlabel('z');
>> grid on; -
surf(X, Y, Z)/mesh(X, Y, Z): 3次元の曲面やメッシュをプロットします。X,Y,Zは同じサイズの行列である必要があります。通常、meshgrid関数を使って2次元平面上の点の座標行列X,Yを作成し、それに対応する関数値Zを計算してから使います。
“`matlab
>> [X, Y] = meshgrid(-2:0.2:2, -2:0.2:2); % グリッド点のX, Y座標行列を作成
>> Z = X .* exp(-X.^2 – Y.^2); % 各点での関数値を計算figure;
surf(X, Y, Z); % 曲面プロット
title(‘Surface Plot’);
xlabel(‘X’); ylabel(‘Y’); zlabel(‘Z’);figure;
mesh(X, Y, Z); % メッシュプロット
title(‘Mesh Plot’);
xlabel(‘X’); ylabel(‘Y’); zlabel(‘Z’);
“`
8.3 その他のプロット
scatter(x, y): 散布図をプロットします。各点をマーカーで表示します。plot(x, y, 'o')と似ていますが、より細かい設定(マーカーのサイズや色など)が可能です。
matlab
>> x_data = randn(1, 100); % 100個の正規乱数
>> y_data = x_data + randn(1, 100)*0.5; % 少しノイズを加えた相関のあるデータ
>> scatter(x_data, y_data, 'filled'); % 中を塗りつぶした丸マーカーで散布図プロット
>> title('Scatter Plot');
>> xlabel('X'); ylabel('Y');bar(x, y): 棒グラフをプロットします。
matlab
>> categories = 1:5;
>> values = [20, 35, 15, 40, 25];
>> bar(categories, values);
>> title('Bar Chart');
>> xlabel('Category');
>> ylabel('Value');
xticks(categories); % x軸の目盛りをカテゴリに合わせるhistogram(data): データのヒストグラムを作成します。データの分布を見るのに便利です。
matlab
>> random_data = randn(1000, 1); % 1000個の正規乱数
>> histogram(random_data);
>> title('Histogram of Random Data');
>> xlabel('Value');
>> ylabel('Frequency');
8.4 サブプロット (subplot)
一つのフィギュアウィンドウの中に、複数の小さなグラフを並べて表示したい場合は subplot 関数を使います。subplot(m, n, p) は、フィギュアウィンドウを m 行 n 列に分割し、そのうちの p 番目(左上から右へ順番に数える)の位置に次のプロットを描画するように設定します。
“`matlab
x = linspace(0, 2*pi, 100);
y_sin = sin(x);
y_cos = cos(x);
y_tan = tan(x);
y_sin_sq = sin(x).^2;figure; % 新しいフィギュアを作成
subplot(2, 2, 1); % 2行2列の1番目の位置 (左上)
plot(x, y_sin);
title(‘sin(x)’);subplot(2, 2, 2); % 2行2列の2番目の位置 (右上)
plot(x, y_cos, ‘r’);
title(‘cos(x)’);subplot(2, 2, 3); % 2行2列の3番目の位置 (左下)
plot(x, y_tan, ‘g’);
title(‘tan(x)’);
ylim([-10, 10]); % y軸の範囲を調整subplot(2, 2, 4); % 2行2列の4番目の位置 (右下)
plot(x, y_sin_sq, ‘m’);
title(‘sin(x)^2’);
“`
8.5 グラフのエクスポート
作成したグラフを画像ファイルとして保存するには、「ファイル」メニューの「エクスポートセットアップ」や「名前を付けて保存」を使う方法と、コマンドを使う方法があります。
saveas(figure_handle, filename, format): アクティブなフィギュアまたは指定したフィギュアハンドルをファイルに保存します。
matlab
>> plot(x, y);
>> saveas(gcf, 'sine_wave.png'); % 現在のフィギュア (gcf) をPNG形式で保存 (拡張子で自動判別)
>> saveas(gcf, 'sine_wave.fig'); % MATLABフィギュア形式で保存 (後でMATLABで再編集可能)
>> saveas(gcf, 'sine_wave.eps'); % EPS形式で保存 (論文などでよく使われる)exportgraphics(graphics_object, filename, format): 推奨される新しい関数です。より高品質なエクスポートが可能です。フィギュア (gcf) や特定の軸 (gca) を指定できます。
matlab
>> plot(x, y);
>> exportgraphics(gcf, 'sine_wave.jpg'); % JPEG形式で保存
>> exportgraphics(gca, 'sine_wave.pdf'); % 現在の軸 (グラフ本体) をPDF形式で保存
これらのプロット機能を使えば、数値データを視覚的に表現し、結果を分かりやすく伝えることができます。
9. 制御構造
MATLABでより複雑な処理やアルゴリズムを実装するには、プログラムの実行フローを制御する構文が必要です。主に「条件分岐」と「繰り返し」があります。
9.1 条件分岐 (if, elseif, else)
特定の条件が満たされた場合にのみ、あるコードブロックを実行します。
“`matlab
% if_example.m
score = 85;
if score >= 90
disp(‘Grade: A’);
elseif score >= 80
disp(‘Grade: B’); % scoreが90未満で80以上の場合はここが実行される
elseif score >= 70
disp(‘Grade: C’);
else
disp(‘Grade: D or lower’); % 上記どの条件も満たされない場合
end % ifブロックの終わり
``if 条件
*: 条件が真 (true) の場合に続くコードブロックを実行します。elseif 条件
*: 直前のifまたはelseifの条件が偽 (false) で、このelseifの条件が真の場合に続くコードブロックを実行します。いくつでも追加できます。else
*: 上記どの条件も満たされなかった場合に続くコードブロックを実行します。省略可能です。end
*:if` ブロックの終わりを示します。必須です。
条件式では、比較演算子 (==, ~=, >, <, >=, <=) や論理演算子 (&& (AND), || (OR), ~ (NOT)) を組み合わせて使います。
“`matlab
x = 10;
y = 5;
if x > 0 && y > 0 % xもyも正の場合
disp(‘Both x and y are positive.’);
end
if x > 10 || y > 10 % xまたはyが10より大きい場合
disp(‘At least one of x or y is greater than 10.’);
end
“`
9.2 繰り返し (for, while)
同じ処理を繰り返し実行する場合に使います。
-
forループ: 指定した回数だけ、あるいは指定した配列の各要素に対して繰り返し処理を行います。
“`matlab
% for_example.m% 1から5までの数字を表示
for i = 1:5 % i は 1, 2, 3, 4, 5 と変化する
disp([‘Current number: ‘, num2str(i)]);
end % forブロックの終わり% ベクトルの各要素に対して処理を行う
my_vector = [10, 20, 30, 40];
for val = my_vector % val は 10, 20, 30, 40 と変化する
disp([‘Processing value: ‘, num2str(val)]);
end% 行列の各列に対して処理を行う
my_matrix = [1 2 3; 4 5 6; 7 8 9];
for col = my_matrix % col は [1; 4; 7], [2; 5; 8], [3; 6; 9] と変化する (列ベクトル)
disp(‘Processing column:’);
disp(col’); % 行ベクトルとして表示
end
``for 変数 = 範囲またはfor 変数 = 配列の形式で書きます。end` でループの終わりを示します。 -
whileループ: 条件が真 (true) である限り、繰り返し処理を行います。無限ループにならないように注意が必要です。
“`matlab
% while_example.mcounter = 1;
while counter <= 5 % counterが5以下の間繰り返す
disp([‘Counter: ‘, num2str(counter)]);
counter = counter + 1; % カウンターを増やす(条件がいつか偽になるように)
end % whileブロックの終わり
``while 条件` の形式で書きます。条件が最初に評価され、真であればブロック内のコードが実行されます。ブロックの実行後、再度条件が評価されます。 -
breakとcontinue:break: ループ(forまたはwhile)の実行を途中で強制終了し、ループの直後のコードにジャンプします。continue: ループの現在の繰り返し処理をスキップし、次の繰り返しに移ります(forの場合は次の要素/値、whileの場合は条件の再評価)。
“`matlab
% break_continue_example.mfor i = 1:10
if i == 3
continue; % i=3のときはスキップして次の繰り返しへ
end
if i == 7
break; % i=7になったらループを終了
end
disp(i);
end
% 結果: 1, 2, 4, 5, 6 が表示される
“`
制御構造を理解することで、より複雑なロジックやアルゴリズムをMATLABで実装できるようになります。
10. 関数(Mファイル関数)の作成
MATLABのスクリプトは複数のコマンドをまとめたものですが、特定の入力を受け取って何らかの処理を行い、結果を返すような再利用可能なコードのまとまりを「関数」として定義できます。関数もMファイルとして保存しますが、スクリプトとは書き方が少し異なります。
10.1 なぜ関数を使うのか?
- 再利用性: 一度関数として定義すれば、異なる入力値に対して何度でも同じ処理を実行できます。
- モジュール化: 大きなプログラムを、機能ごとの小さな関数に分割することで、コードが整理され、読みやすく、管理しやすくなります。
- デバッグの容易さ: 関数ごとにテストやデバッグができるため、問題の特定が容易になります。
- 可読性の向上: 複雑な処理に名前(関数名)をつけることで、プログラム全体の意図が分かりやすくなります。
10.2 関数の定義
関数を定義するMファイルは、ファイル名の先頭に関数名と同じ名前を付ける必要があります(例: my_function.m というファイルに関数 my_function を定義する)。そして、ファイルの先頭は function キーワードで始めます。
“`matlab
% my_function.m (ファイル名と関数名は同じにする)
function output_arg = my_function(input_arg1, input_arg2)
% MY_FUNCTION この関数は入力引数を足し合わせます。
% output_arg = my_function(input_arg1, input_arg2) は、
% input_arg1 と input_arg2 を加算した結果を output_arg として返します。
%
% 例:
% result = my_function(5, 3); % result は 8 になる
%
% 詳細は help my_function を参照。
% 関数の本体(処理内容)
output_arg = input_arg1 + input_arg2;
end % 関数の終わり
``function
*キーワード: 関数の定義開始を示します。output_arg
*: 関数の出力引数を受け取る変数名です。複数ある場合は[output_arg1, output_arg2, …]のように角括弧で囲みます。my_function
*: 関数名です。ファイル名と同じにするのがルールです。(input_arg1, input_arg2)
*: 関数の入力引数を受け取る変数名です。複数ある場合はカンマで区切ります。入力引数がない場合は丸括弧()だけ、または省略も可能です。%
*で始まるコメント行: 関数定義のすぐ後に続く連続したコメント行は、その関数の「ヘルプコメント」として認識されます。help 関数名とコマンドウィンドウで入力した際に表示される内容になります。最初の1行目(H1行と呼ばれる)は特に重要で、関数の一覧を表示した際などに短く関数を説明します。end`: 関数定義の終わりを示します(省略可能な場合もありますが、記述する方が分かりやすいです)。
* 関数の本体: 入力引数を使って計算などの処理を行い、その結果を出力引数に対応する変数に代入します。
*
10.3 関数の呼び出し方
定義した関数は、スクリプトやコマンドウィンドウから、関数名の後に引数を丸括弧で囲んで指定することで呼び出せます。
“`matlab
result = my_function(10, 5); % 関数を呼び出し、結果を変数resultに格納
result =
15my_function(1, 1) % 結果を変数に格納しない場合はansに代入される
ans =
2
“`
10.4 複数の出力引数
関数は複数の出力引数を返すこともできます。その場合、関数定義の function 行と、関数呼び出しの際に、出力引数を角括弧 [] で囲みます。
“`matlab
% min_max_avg.m
function [min_val, max_val, avg_val] = min_max_avg(input_vec)
% MIN_MAX_AVG ベクトルの最小値、最大値、平均値を計算します。
% [min_val, max_val, avg_val] = min_max_avg(input_vec) は、
% ベクトル input_vec の最小値 (min_val)、最大値 (max_val)、
% 平均値 (avg_val) を返します。
min_val = min(input_vec);
max_val = max(input_vec);
avg_val = mean(input_vec);
end
“`
この関数を呼び出す際は、以下のように複数の変数で結果を受け取ります。
“`matlab
data = [10, 2, 8, 15, 5];
[minimum, maximum, average] = min_max_avg(data); % 3つの変数で結果を受け取るminimum
minimum =
2
maximum
maximum =
15
average
average =
8
``~` を使って不要な出力を無視することもできます(バージョンによっては利用できないこともあります)。
もし全ての出力が必要ない場合は、必要な分だけ変数を用意するか、チルダ
“`matlab
[minimum, ~, average] = min_max_avg(data); % 最大値は不要なので無視
“`
10.5 ローカル変数とグローバル変数
関数内で定義された変数(入力引数、出力引数、関数本体で新たに作成された変数)は、その関数の中だけで有効な「ローカル変数」です。関数が終了すると、これらの変数は消滅します。ワークスペースの変数とは基本的に独立しています。
“`matlab
% example_func.m
function y = example_func(x)
local_var = x * 2; % local_var はこの関数内のみ有効
y = local_var + 1;
end
% コマンドウィンドウまたは別のスクリプト
global_var = 100; % global_var はワークスペースに存在する
result = example_func(5); % example_func を呼び出す
result =
11whos % ワークスペースの変数を表示
% Variables in the current scope:
% Name Size Bytes Class Attributes
% global_var 1×1 8 double
% result 1×1 8 double
% x 1×1 8 double % 関数実行中の一時的な変数 (表示されないことも多い)
% y 1×1 8 double % 関数実行中の一時的な変数 (表示されないことも多い)clear result; % 関数が終了するとローカル変数は消えるので local_var は表示されない
``global_var
ワークスペースにはとresultがありますが、関数内のlocal_var` は存在しません。
特殊なケースとして、複数の関数やワークスペース間で変数を共有したい場合に「グローバル変数」を使うことができますが、これはコードの見通しを悪くし、デバッグを難しくする傾向があるため、必要最小限にとどめるのが推奨されます。代わりに、引数として値を渡したり、関数からの戻り値として受け取ったりする方法を優先すべきです。
“`matlab
% (非推奨) global_var_example.m
function increment_global()
global my_global_var; % グローバル変数として宣言
my_global_var = my_global_var + 1;
end
% コマンドウィンドウまたは別のスクリプト
global my_global_var; % ワークスペースでもグローバル変数として宣言
my_global_var = 0;increment_global();
my_global_var % 1 になっている
my_global_var =
1increment_global();
my_global_var % 2 になっている
my_global_var =
2
``global` キーワードを使って宣言された変数は、同じ名前でグローバル宣言された他のスコープ(関数やワークスペース)からアクセス・変更できるようになります。
関数を使いこなせるようになると、MATLABを使ったプログラミングの幅が大きく広がります。
11. デバッグ
どんなプログラマでも、コードに間違い(バグ)はつきものです。エラーメッセージを理解し、効率的にバグを見つけて修正する(デバッグする)スキルは非常に重要です。
11.1 エラーの種類
プログラムのエラーは、大きく分けて以下の3種類があります。
- 構文エラー (Syntax Error): MATLABの文法に誤りがある場合のエラーです。タイプミス、括弧の閉じ忘れ、関数の引数の数が違うなどが原因です。Mファイルのエディターでは、エラーがある行に赤い下線が引かれたり、インジケーターが表示されたりするので、比較的見つけやすいです。実行前に検出されることが多いです。
matlab
plot(x, y % 丸括弧が閉じられていない - 実行時エラー (Runtime Error): 文法は正しいが、プログラムの実行中に発生するエラーです。例えば、存在しないファイルを開こうとする、ゼロで割り算をする、配列の範囲外の要素にアクセスしようとするなどが原因です。通常、エラーメッセージが表示され、プログラムの実行が停止します。
matlab
A = [1 2; 3 4];
inv(A); % Aは特異行列ではないのでOK
B = [1 2; 2 4];
inv(B); % Bは特異行列なので実行時エラーが発生する
matlab
data = [10, 20, 30];
disp(data(5)); % 5番目の要素は存在しないのでエラー - 論理エラー (Logical Error): プログラムはエラーなく実行されるが、期待した結果が得られない場合です。アルゴリズムの間違い、数式の誤り、変数の使い間違いなどが原因です。MATLABは何もエラーメッセージを出さないため、デバッグが最も難しい種類のエラーです。ワークスペースの変数の中身を確認したり、処理の途中経過を表示したりしながら原因を探る必要があります。
11.2 デバッギングツールの使い方
MATLABのエディターには、デバッグを支援するための強力なツールが備わっています。
- ブレークポイントの設定: エディターの行番号の左側の灰色の領域をクリックすると、赤い点(ブレークポイント)が設定されます。プログラムを実行すると、ブレークポイントに達した行で実行が一時停止します。
- デバッグモード: プログラムがブレークポイントで停止すると、MATLABは「デバッグモード」に入ります。コマンドウィンドウのプロンプトが
K>>のように変わります。デバッグモードでは、停止した時点でのワークスペースの変数を確認したり、コマンドウィンドウで任意のコマンドを実行したり、関数を呼び出したりできます。 -
ステップ実行: デバッグモード中にエディターのツールバーにあるステップ実行ボタンを使うか、以下のキーを押すことで、コードを1行ずつ実行できます。
- ステップ (Step) または ステップイン (Step In) (F11): 現在の行を実行します。その行が別の関数呼び出しであれば、その関数の中に入って実行を続けます。
- ステップオーバー (Step Over) (F10): 現在の行を実行します。その行が別の関数呼び出しであっても、関数の中には入らず、関数全体を実行して次の行に進みます。
- ステップアウト (Step Out) (Shift+F11): 現在実行中の関数を最後まで実行し、その関数を呼び出した場所の次の行に戻ります。
- 続行 (Continue) (F5): 次のブレークポイントまで、あるいはプログラムの最後まで実行を続けます。
- 停止 (Quit Debugging) (Shift+F5): デバッグモードを終了し、プログラムの実行を完全に停止します。
-
変数のウォッチ: エディターの下部にある「変数」タブや、ワークスペースウィンドウで、停止した時点での変数の値を確認できます。値がおかしい変数がないか調べるのに役立ちます。
デバッグの基本的な流れ:
- エラーが発生した、あるいは結果がおかしいコードの疑わしい箇所にブレークポイントを設定します。
- スクリプトを実行します。ブレークポイントで実行が停止します。
- 停止した時点でのワークスペースの変数や、ツールチップで変数の値を確認し、想定通りの値になっているか調べます。
- ステップ実行を使って、コードを1行ずつ進めながら、各行の実行後に変数の値がどう変化するかを注意深く観察します。
- コマンドウィンドウで、停止したコンテキストの変数を使って簡単な計算や関数呼び出しを行い、コードの動作を検証することもできます。
- 怪しい箇所を特定したら、コードを修正します。
- デバッグモードを終了し、修正したコードで再度実行して、エラーが解消されたか、期待通りの結果が得られるか確認します。
このデバッグのプロセスを繰り返し行うことで、バグの原因を特定し、修正することができます。
12. Simulinkの紹介(簡単な概要)
MATLABはテキストベースのプログラミング環境ですが、動的システムのモデリング、シミュレーション、解析に特化した「Simulink」という別の環境がMathWorks社から提供されています。SimulinkはMATLABとは異なり、ブロック線図を使ったグラフィカルなインターフェースでシステムを構築します。
- グラフィカルモデリング: 電子回路、制御システム、通信システム、物理システムなど、様々なシステムの構成要素をブロックとして配置し、それらを線で接続することでシステムのモデルを作成します。
- シミュレーション: 作成したモデルに対して、時間応答などをシミュレーションすることができます。システムの挙動を視覚的に確認したり、設計を検証したりするのに役立ちます。
- MATLABとの連携: SimulinkモデルのパラメーターをMATLABの変数で定義したり、シミュレーション結果をMATLABのワークスペースに保存してMATLABの機能で解析・可視化したりすることができます。また、MATLAB関数をSimulinkブロックとして利用することも可能です。
SimulinkはMATLABとは独立したツールとして提供されることが多いですが、MATLABと密接に連携しているため、MATLABユーザーにとって非常に有用なツールです。制御工学やシステムダイナミクスなどの分野を学ぶ際には、Simulinkも合わせて学ぶことになるでしょう。
この記事ではMATLAB本体に焦点を当てているためSimulinkの詳細には立ち入りませんが、MATLABの学習を進める上で、Simulinkという便利なツールがあることを頭の片隅に置いておくと良いでしょう。
13. その他便利な機能
MATLABには、これまでに紹介した基本機能以外にも、作業効率を高める様々な機能があります。
- ツールボックス: MATLAB本体は数値計算の基礎を提供しますが、特定の専門分野向けの高度な機能は「ツールボックス」として提供されています。例えば、信号処理ツールボックス、画像処理ツールボックス、コントロールシステムツールボックス、機械学習ツールボックス、ディープラーニングツールボックスなどがあります。これらは別途ライセンスが必要な場合がありますが、それぞれの分野の標準的なアルゴリズムや関数が豊富に用意されており、開発時間を大幅に短縮できます。
- ライブスクリプト (Live Script): 従来のMファイルよりも新しい形式のスクリプトです(拡張子は
.mlx)。コード、実行結果、グラフ、整形済みテキスト、数式、画像などを一つのドキュメントに統合できます。コードの解説を書きながら実行結果やグラフをその場で確認できるため、ドキュメント作成や教育、インタラクティブな探索的解析に非常に適しています。 - App Designer: GUI(グラフィカルユーザーインターフェース)を持つオリジナルのアプリケーションを、ドラッグ&ドロップ操作を中心に比較的容易に開発できるツールです。ユーザーが入力値を変更したり、ボタンをクリックしたりすることで、MATLABコードを実行するようなアプリを作成できます。
- パフォーマンス改善: 大規模な計算を行う際に、コードの実行時間を短縮するための機能があります。
tic,toc: コードの一部区間の実行時間を測定します。
matlab
tic; % タイマー開始
% 時間を測りたい処理
A = rand(1000);
B = inv(A);
toc; % タイマー停止、経過時間を表示- Profiler: スクリプトや関数全体の実行時間を詳細に解析し、どの行や関数がボトルネックになっているかを特定できます。
- パラレルコンピューティング: 複数のCPUコアやGPUを使って計算を並列化し、処理時間を短縮する機能です。大きなデータセットの処理や複雑なシミュレーションなどで有効です。
これらの機能は必要に応じて学ぶことで、MATLABの活用範囲をさらに広げることができます。
14. 学習リソース
この記事はMATLABの学習の出発点ですが、MATLABをマスターするためには、さらに学習を続けることが重要です。幸い、MathWorks社やコミュニティによって、豊富な学習リソースが提供されています。
- MathWorks公式ドキュメント: MATLABに関する最も正確で網羅的な情報源です。関数の詳細な説明、例題、概念的な解説などが含まれています。分からないことがあれば、まず
doc 関数名やヘルプブラウザで公式ドキュメントを調べましょう。 - MATLAB Onramp: MathWorks社が提供する、MATLABの基本をインタラクティブに学べる無料のオンラインコースです。実際にMATLABのコマンドを入力しながら進められるため、手を動かしながら効率的に基本を習得できます。この記事で紹介した内容の多くを、Onrampでも体験できます。MATLABのインストール直後に試してみるのがおすすめです。
- MathWorksラーニング: Onramp以外にも、MathWorks社は様々な分野(機械学習、信号処理など)に関するオンラインコースを提供しています。一部は有償ですが、体系的に学ぶのに役立ちます。
- MathWorks Community: MATLABユーザーが集まるオンラインコミュニティです。フォーラムで質問したり、他のユーザーの質問と回答を見たり、ファイル交換サイトで便利なコードを探したりできます。
- オンラインコース: Coursera, edX, Udemyなどのオンライン学習プラットフォームでも、MATLABに関する様々なレベルのコースが提供されています。
- 書籍: 初心者向けから専門分野向けまで、多くのMATLAB関連書籍が出版されています。自分の学習スタイルに合った書籍を見つけるのも良い方法です。
- 大学の授業や教材: MATLABを使っている大学の授業では、MATLABの使い方も含めて教えてくれることが多いです。提供される教材や演習課題も貴重な学習リソースになります。
- YouTubeなどの動画コンテンツ: MATLABの使い方や特定の機能に関する解説動画も多数公開されています。視覚的に学びたい場合に有効です。
これらのリソースを組み合わせて活用し、MATLABのスキルを着実に向上させていきましょう。
15. まとめ:MATLAB学習の次へ
この記事では、MATLABがどのようなツールで、なぜ工学・科学技術分野で広く使われているのか、そしてMATLABのインストールから基本的な操作、変数、配列、スクリプト、制御構造、関数、プロット、データの入出力、デバッグといった核となる機能について詳細に解説しました。
MATLABの学習は、これらの基本的な要素を理解することから始まります。最初は戸惑うこともあるかもしれませんが、実際にMATLABを起動してコマンドを打ったり、簡単なスクリプトを書いて実行したり、データをいじってみたりと、手を動かすことが何よりも大切です。
この記事で学んだことを土台として、ぜひ以下のステップに進んでみてください。
- MATLAB Onrampを完了させる: インタラクティブな環境で基本操作を復習し、定着させましょう。
- 興味のある分野のデータを探してみる: 公開されているデータセットなどを使って、データの読み込み、基本的な統計処理、グラフ作成などを実際に行ってみましょう。
- 簡単な計算やアルゴリズムを実装してみる: 教科書に出てくる数式や、他の言語で書かれた簡単なプログラムなどを、MATLABで実装してみましょう。
- エラーが出たら恐れずデバッグしてみる: エラーメッセージを読んで、ブレークポイントやステップ実行を使って、自分で問題を解決する練習をしましょう。
- 公式ドキュメントやコミュニティを活用する: 分からないことがあれば、まずは自分で調べる癖をつけましょう。
MATLABは非常に多機能なツールです。一度に全てを学ぶ必要はありません。自分の目的や必要に応じて、少しずつ機能やツールボックスを学び広げていくのが良いでしょう。
工学、科学、金融、データサイエンスなど、様々な分野でMATLABは強力な武器となります。この記事が、あなたのMATLAB学習の良いスタートとなることを願っています。さあ、MATLABを使って、あなたのアイデアやデータを形にしていきましょう!
応援しています!