Learn in 10 minutes

Learn in 10 minutes

10分でMATLABをマスター

MATLAB(Matrix Laboratory)は、数値計算、アルゴリズム開発、データ可視化のために設計された 高水準プログラミング言語および環境です。1970年代後半に開発されたMATLABは、工学、 科学、数学において不可欠なツールとなっています。

このチュートリアルではMATLABの基礎を扱い、この強力な計算環境を使い始められるようになります。

1. 最初のMATLABプログラム

hello.mというスクリプトファイルを作成するか、MATLABコマンドウィンドウに直接コマンドを入力します。

disp('Hello, World!')

またはfprintf関数を使います:

fprintf('Hello, World!\n')

出力はこうなります:

Hello, World!

disp()関数は内容を直接表示しますが、fprintf()はCのprintfと同様に、より柔軟な書式設定を 提供できます。

2. 基本構文

MATLABには、一般的なプログラミング言語とは異なる独自の構文ルールがあります。 这些基础知识对于编写简洁、易维护的代码至关重要。

2.1 コメント

1行コメントはパーセント記号%で始まります:

% これはコメントです
x = 10;  % xに10を代入

複数行コメントには%{%}を使います:

%{
これは複数行コメントです。
複数行にまたがることができます。
%}

2.2 セミコロン

セミコロン;は出力を抑制します。セミコロンを付けないと、MATLABは結果を表示します:

x = 5     % 表示: x = 5
y = 10;   % 出力なし、しかしyには代入されている

2.3 大文字と小文字の区別

MATLABは大文字と小文字を区別します。Aaは異なる変数です:

A = 5;
a = 10;
disp(A)  % 出力: 5
disp(a)  % 出力: 10

2.4 変数名の付け方

変数名は文字で始まり、その後に文字、数字、アンダースコアを続けます:

valid_name = 1;
another_valid_name_123 = 2;
% 123invalid = 3;  % エラー: 数字で始まることはできない

2.5 基本演算

MATLABは行列入力を得意としています。行列の作成は簡単です:

A = [1 2 3; 4 5 6; 7 8 9]  % 3x3行列

出力:

A =

     1     2     3
     4     5     6
     7     8     9

3. 変数とデータ型

MATLABは動的型付けを使用しています。変数は代入時に作成され、その型は代入された値によって決まります。

3.1 数値型

MATLABではデフォルトですべての数値が倍精度浮動小数点数として保存されます:

% 整数
int_num = 42;

% 浮動小数点数
float_num = 3.14159;

% 科学的記数法
sci_num = 2.5e-3;  % 0.0025

3.2 文字列

文字列変数には単一引用符を使います:

str = 'Hello, MATLAB';
str2 = "Hello, MATLAB";  % 文字列配列 (R2016b+)

文字列の連結:

str1 = 'Hello';
str2 = 'World';
combined = [str1 ', ' str2];  % 'Hello, World'

3.3 論理値(ブール)

論理値はtrueまたはfalseです:

flag = true;
result = false;

% 論理演算
a = true;
b = false;
and_result = a && b;    % false
or_result = a || b;     % true
not_result = ~a;        % false

3.4 文字配列と文字列の違い

MATLABには文字配列と文字列オブジェクトの両方があります:

% 文字配列(旧スタイル)
char_arr = 'Hello';

% 文字列オブジェクト(モダンスタイル、R2016b+)
str_obj = "Hello";

% 文字列オブジェクトの方が扱いやすい
name = "Alice";
greeting = "Hello, " + name;  % 自然動作

4. データ構造

MATLABはさまざまなユースケースに対応した複数のデータ構造を提供しています。

4.1 ベクトル

ベクトルは1次元配列です:

% 行ベクトル
row_vec = [1 2 3 4 5];

% 列ベクトル
col_vec = [1; 2; 3; 4; 5];

% コロン演算子を使用
range_vec = 1:5;        % [1 2 3 4 5]
step_vec = 0:2:10;      % [0 2 4 6 8 10]

% linspaceで等間隔の値を作成
lin_vec = linspace(0, 10, 5);  % [0 2.5 5 7.5 10]

4.2 行列

行列はMATLABの根幹を成しています:

% 直接行列を作成
A = [1 2 3; 4 5 6; 7 8 9];

% 要素にアクセス
element = A(2, 3);  % 6を返す(2行目、3列目)

% 行列演算
B = A';            % 転置
C = A * B;         % 行列乗算
D = A .* B;        % 要素ごとの乗算

4.3 セル配列

セル配列は異なる型のデータを保持できます:

% セル配列を作成
cell_arr = {1, 'hello', [1 2 3], true};

% 波括弧でセル内容にアクセス
data = cell_arr{2};  % 'hello'を返す

% 括弧でセルにアクセス
sub_cell = cell_arr(1:2);  % {1, 'hello'}を返す

4.4 構造体

構造体は名前付きフィールドを持つ辞書のようなものです:

% 構造体を作成
student.name = 'John';
student.age = 20;
student.major = 'Engineering';

% フィールドにアクセス
disp(student.name);  % 出力: John

% 構造体配列
students(1).name = 'Alice';
students(1).age = 21;
students(2).name = 'Bob';
students(2).age = 22;

4.5 テーブル

テーブルは表形式データに適しています:

% テーブルを作成
Age = [25; 30; 35];
Name = {'Alice'; 'Bob'; 'Charlie'};
Salary = [50000; 60000; 70000];

T = table(Name, Age, Salary);

% データにアクセス
disp(T.Age);
disp(T.Name{1});

5. 演算子

MATLABは算術演算、比較演算、論理演算のためのさまざまな演算子を提供しています。

5.1 算術演算子

a = 10;
b = 3;

sum = a + b;           % 13
diff = a - b;          % 7
prod = a * b;          % 30
quot = a / b;          % 3.3333
int_div = floor(a/b);  % 3
mod = mod(a, b);       % 1(余り)
pow = a ^ b;           % 1000

5.2 要素ごとの演算子

要素ごとの演算子は対応する要素に対して動作します:

A = [1 2 3];
B = [4 5 6];

C = A .* B;  % 要素ごと: [4 10 18]
D = A.^2;    % 要素ごとの2乗: [1 4 9]

5.3 比較演算子

x = 5;
y = 10;

eq = (x == y);    % false
neq = (x ~= y);   % true
gt = (x > y);     % false
lt = (x < y);     % true
ge = (x >= y);    % false
le = (x <= y);    % true

5.4 論理演算子

a = true;
b = false;

and_op = a & b;     % false(要素ごとのAND)
or_op = a | b;      % true(要素ごとのOR)
not_op = ~a;        % false
and_short = a && b; % false(短絡AND)
or_short = a || b;  % true(短絡OR)

6. 制御フロー

MATLABは標準的な制御フロー構造を提供していますが、Pythonなどの言語とは異なる構文を持っています。

6.1 if-elseif-else

score = 85;

if score >= 90
    grade = 'A';
elseif score >= 80
    grade = 'B';
elseif score >= 70
    grade = 'C';
else
    grade = 'F';
end

disp(grade)  % 出力: B

6.2 switch

switch文は1つの式を複数のケースと比較します:

day = 'Monday';

switch day
    case {'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'}
        disp('Weekday');
    case {'Saturday', 'Sunday'}
        disp('Weekend');
    otherwise
        disp('Invalid day');
end

6.3 forループ

forループは範囲または配列に対して反復します:

% 範囲を反復
for i = 1:5
    disp(i);
end

% 配列を反復
fruits = {'apple', 'banana', 'orange'};
for fruit = fruits
    disp(fruit{1});
end

% 行列演算用のネストされたループ
A = [1 2; 3 4];
B = zeros(2, 2);
for i = 1:2
    for j = 1:2
        B(i, j) = A(i, j) * 2;
    end
end

6.4 whileループ

count = 0;
while count < 5
    disp(count);
    count = count + 1;
end

6.5 ループ制御

break文はループを終了し、continueは次の反復跳过します:

% breakを使用
for i = 1:10
    if i == 5
        break;
    end
    disp(i);
end
% 出力: 1 2 3 4

% continueを使用
for i = 1:5
    if mod(i, 2) == 0
        continue;  % 偶数をスキップ
    end
    disp(i);
end
% 出力: 1 3 5

7. 入力と出力

7.1 ユーザー入力

input()関数を使ってユーザー入力を取得します:

% 数値入力を取得
num = input('Enter a number: ');

% 文字列入力を取得
name = input('Enter your name: ', 's');

% 式入力を取得(入力を評価)
expr = input('Enter an expression: ');

7.2 出力の表示

出力を表示するいくつかの関数があります:

% disp - 简单な表示
disp('Hello');
disp([1 2 3]);

% fprintf - 書式付き出力
name = 'Alice';
age = 25;
fprintf('Name: %s, Age: %d\n', name, age);

% sprintf - 書式付き文字列の作成
str = sprintf('Value: %.2f', 3.14159);
disp(str);

7.3 書式指定子

MATLABの一般的な書式指定子:

% %s - 文字列
% %d - 整数
% %f - 浮動小数点数
% %.2f - 小数点以下2桁の浮動小数点数
% %e - 科学的記数法

fprintf('%d %.2f %e\n', 42, 3.14159, 1000)
% 出力: 42 3.14 1.000000e+03

8. 関数

MATLABの関数は通常別ファイルで定義しますが、匿名関数を使うとインラインで関数を作成できます。

8.1 匿名関数

匿名関数は別ファイルなしで简单な関数を作成します:

% 单一入力
square = @(x) x^2;
disp(square(5));  % 出力: 25

% 複数入力
add = @(x, y) x + y;
disp(add(3, 4));  % 出力: 7

% 複数式
hypot = @(x, y) sqrt(x^2 + y^2);
disp(hypot(3, 4));  % 出力: 5

8.2 関数ファイル

myfunc.mというファイルを作成します:

function y = myfunc(x)
    y = x^2 + 1;
end

関数を呼び出します:

result = myfunc(5);  % 出力: 26

8.3 複数出力を持つ関数

function [sum, prod] = calc(x, y)
    sum = x + y;
    prod = x * y;
end

複数出力で呼び出します:

[s, p] = calc(3, 4);
disp(s);  % 7
disp(p);  % 12

8.4 可変引数

可変引数にはvararginvarargoutを使います:

function result = sum_all(varargin)
    result = 0;
    for i = 1:length(varargin)
        result = result + varargin{i};
    end
end

% 任意の引数で呼び出し
total = sum_all(1, 2, 3, 4, 5);  % 出力: 15

9. スクリプトファイル

スクリプトはMATLABコマンドの序列を含む.mファイルです。ワークスペースのデータに対して動作します:

% myscript.mとして保存
% データセットの統計を計算
data = [1 2 3 4 5 6 7 8 9 10];

mean_val = mean(data);
std_val = std(data);
max_val = max(data);
min_val = min(data);

fprintf('Mean: %.2f\n', mean_val);
fprintf('Std: %.2f\n', std_val);
fprintf('Max: %d\n', max_val);
fprintf('Min: %d\n', min_val);

10. エラー処理

エラー処理にはtry-catchを使います:

try
    result = risky_operation();
catch ME
    fprintf('Error: %s\n', ME.message);
    % エラーを処理
    result = 0;
end

error()を使ってエラーを発生させます:

function result = divide(a, b)
    if b == 0
        error('Division by zero is not allowed');
    end
    result = a / b;
end

11. ファイル操作

11.1 データの保存と読み込み

% 変数をファイルに保存
x = [1 2 3];
y = 'hello';
save('data.mat', 'x', 'y');

% ファイルから変数を読み込み
load('data.mat');

% テキストファイルに保存
writematrix(x, 'data.txt');

% テキストファイルから読み込み
data = readmatrix('data.txt');

11.2 テキストファイル操作

% テキストファイルに書き込み
fid = fopen('output.txt', 'w');
fprintf(fid, 'Line 1\n');
fprintf(fid, 'Line 2\n');
fclose(fid);

% テキストファイルから読み込み
fid = fopen('output.txt', 'r');
while ~feof(fid)
    line = fgetl(fid);
    if ischar(line)
        disp(line);
    end
end
fclose(fid);

textscanを使って構造的に読み込みます:

fid = fopen('data.txt', 'r');
format = '%s %d %f';
C = textscan(fid, format);
fclose(fid);

name = C{1};
age = C{2};
score = C{3};

12. グラフ描画

MATLABのグラフ描画機能は、最も強力な機能の一つです。

12.1 基本的な2D描画

x = 0:0.1:2*pi;
y = sin(x);

plot(x, y);
xlabel('x');
ylabel('sin(x)');
title('Sine Wave');
grid on;

12.2 複数のグラフ

x = 0:0.1:2*pi;

% サブプロット
subplot(2, 1, 1);
plot(x, sin(x));
title('Sine');

subplot(2, 1, 2);
plot(x, cos(x));
title('Cosine');

12.3 グラフのカスタマイズ

x = 0:0.1:10;
y1 = x;
y2 = x.^2;

plot(x, y1, 'b-', 'LineWidth', 2);  % 青い実線
hold on;
plot(x, y2, 'r--', 'LineWidth', 2); % 赤破線
hold off;

xlabel('X');
ylabel('Y');
legend('Linear', 'Quadratic');
title('Linear vs Quadratic');
grid on;

12.4 その他のグラフ种类

% 棒グラフ
bar([1 2 3 4], [10 20 15 25]);

% ヒストグラム
data = randn(1000, 1);
histogram(data, 30);

% 散布図
x = rand(100, 1);
y = 2*x + randn(100, 1)*0.1;
scatter(x, y);