MATLAB

#21
TIOBE#12
PYPL#14
GitHub#24
IEEESpectrum#24
プログラミング言語数値計算科学技術計算工学データ分析信号処理

プログラミング言語

MATLAB

概要

MATLABは、数値計算、データ分析、アルゴリズム開発のための高水準プログラミング言語および対話型環境です。

詳細

MATLAB(Matrix Laboratory)は1984年にMathWorks社によって開発された科学技術計算特化のプログラミング言語・環境で、行列演算を中心とした数値計算処理に最適化されています。エンジニアリング、科学研究、金融分析、医療画像処理など幅広い分野で使用されており、豊富な組み込み関数、専門ツールボックス、視覚化機能を提供します。直感的な構文と対話型環境により、複雑な数学的計算やデータ分析を効率的に実行でき、プロトタイピングから本格的なアプリケーション開発まで対応可能です。Simulinkとの連携により、モデルベース設計や制御システム開発にも広く活用されています。

書き方の例

Hello World

% 基本的な出力
disp('Hello, World!')

% 変数を使った出力
message = 'こんにちは、MATLAB!';
disp(message)

% フォーマット出力
name = '太郎';
age = 25;
fprintf('私の名前は%sで、%d歳です。\n', name, age)

% 数値の出力
pi_value = pi;
fprintf('円周率: %.4f\n', pi_value)

% 複数の変数
x = 10;
y = 20;
result = x + y;
fprintf('%d + %d = %d\n', x, y, result)

変数と基本データ型

% スカラー変数
number = 42;
float_num = 3.14159;
complex_num = 3 + 4i;
logical_val = true;

% 文字列
str1 = 'シングルクォート文字列';
str2 = "ダブルクォート文字列";

% ベクトル(1次元配列)
row_vector = [1, 2, 3, 4, 5];
column_vector = [1; 2; 3; 4; 5];
range_vector = 1:5;  % 1から5まで
range_step = 0:0.5:2;  % 0から2まで0.5刻み

% 行列(2次元配列)
matrix_2x3 = [1, 2, 3; 4, 5, 6];
identity_matrix = eye(3);  % 3x3単位行列
zeros_matrix = zeros(2, 4);  % 2x4零行列
ones_matrix = ones(3, 3);  % 3x3全て1の行列
random_matrix = rand(3, 3);  % 3x3乱数行列

% セル配列
cell_array = {'文字列', 42, [1, 2, 3]};
cell_array{1} = '新しい文字列';

% 構造体
person.name = '田中太郎';
person.age = 30;
person.scores = [85, 92, 78];

disp(['数値: ', num2str(number)]);
disp(['行列サイズ: ', num2str(size(matrix_2x3))]);
disp(['複素数: ', num2str(complex_num)]);

条件分岐

% 基本的なif文
score = 85;

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

fprintf('得点: %d, 評価: %s\n', score, grade);

% 複数条件の組み合わせ
age = 20;
has_license = true;

if age >= 18 && has_license
    disp('運転できます');
elseif age >= 18
    disp('免許を取得してください');
else
    disp('18歳になってから免許を取得してください');
end

% switch文
day = '水曜日';
switch day
    case '月曜日'
        disp('週の始まり');
    case '水曜日'
        disp('週の中間');
    case '金曜日'
        disp('週末まであと少し');
    otherwise
        disp('他の曜日');
end

% 論理演算子
value = 10;
if value > 5 && value < 15
    disp('5より大きく15より小さい');
end

if value == 10 || value == 20
    disp('10または20です');
end

配列と行列の操作

% ベクトルの作成と操作
fruits = {'りんご', 'バナナ', 'オレンジ'};
fruits{end+1} = 'ぶどう';  % 要素の追加

% 数値配列の操作
numbers = [1, 2, 3, 4, 5];
numbers(end+1) = 6;  % 要素の追加
numbers(2) = 10;     % 要素の変更

% 行列の作成と操作
A = [1, 2, 3; 4, 5, 6; 7, 8, 9];
B = [9, 8, 7; 6, 5, 4; 3, 2, 1];

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

% 行列の特定要素にアクセス
element = A(2, 3);    % 2行3列の要素
row = A(2, :);        % 2行目全体
column = A(:, 1);     % 1列目全体
submatrix = A(1:2, 2:3);  % 部分行列

% 配列の統計
mean_val = mean(numbers);
std_val = std(numbers);
max_val = max(numbers);
min_val = min(numbers);

fprintf('平均: %.2f, 標準偏差: %.2f\n', mean_val, std_val);
fprintf('最大: %d, 最小: %d\n', max_val, min_val);

% 論理インデックス
large_numbers = numbers(numbers > 3);
disp(['3より大きい数: ', num2str(large_numbers)]);

ループ処理

% for文(配列の要素)
fruits = {'りんご', 'バナナ', 'オレンジ'};
for i = 1:length(fruits)
    fprintf('果物 %d: %s\n', i, fruits{i});
end

% for文(数値範囲)
for i = 1:5
    square = i^2;
    fprintf('%d の2乗は %d です\n', i, square);
end

% while文
count = 0;
while count < 5
    count = count + 1;
    fprintf('カウント: %d\n', count);
end

% 行列の各要素を処理
matrix = [1, 2, 3; 4, 5, 6];
for i = 1:size(matrix, 1)  % 行数分ループ
    for j = 1:size(matrix, 2)  % 列数分ループ
        fprintf('行%d 列%d: %d\n', i, j, matrix(i, j));
    end
end

% vectorized operations(推奨)
numbers = 1:10;
squares = numbers.^2;  % 全要素の2乗を一度に計算
disp(['1-10の2乗: ', num2str(squares)]);

% find関数を使った条件検索
data = [1, 5, 3, 8, 2, 9, 4];
indices = find(data > 5);
values = data(indices);
fprintf('5より大きい値: %s\n', num2str(values));

関数の定義と呼び出し

% 基本的な関数(別ファイルに保存)
% calculate_area.m
function area = calculate_area(width, height)
    if nargin < 2
        height = 10;  % デフォルト値
    end
    area = width * height;
end

% 複数の返り値を持つ関数
% stats.m
function [mean_val, std_val, max_val, min_val] = stats(data)
    mean_val = mean(data);
    std_val = std(data);
    max_val = max(data);
    min_val = min(data);
end

% 関数の呼び出し例
area1 = calculate_area(5, 8);
area2 = calculate_area(6);  % heightはデフォルト値

data = [1, 5, 3, 8, 2, 9, 4];
[m, s, max_v, min_v] = stats(data);
fprintf('平均: %.2f, 標準偏差: %.2f, 最大: %d, 最小: %d\n', m, s, max_v, min_v);

% 無名関数(lambda関数)
square_func = @(x) x.^2;
double_func = @(x) 2 * x;

result1 = square_func(5);
result2 = double_func(10);
fprintf('5の2乗: %d, 10の2倍: %d\n', result1, result2);

% 数値積分の例
f = @(x) x.^2 + 2*x + 1;
integral_result = integral(f, 0, 2);
fprintf('積分結果: %.4f\n', integral_result);

数値計算とグラフ作成

% 基本的なプロット
x = 0:0.1:2*pi;
y = sin(x);
z = cos(x);

figure;
plot(x, y, 'b-', 'LineWidth', 2);
hold on;
plot(x, z, 'r--', 'LineWidth', 2);
title('三角関数のグラフ');
xlabel('x');
ylabel('y');
legend('sin(x)', 'cos(x)');
grid on;

% 3Dプロット
[X, Y] = meshgrid(-2:0.1:2, -2:0.1:2);
Z = X.^2 + Y.^2;

figure;
surf(X, Y, Z);
title('3Dサーフェスプロット');
xlabel('X');
ylabel('Y');
zlabel('Z');
colorbar;

% 統計プロット
data = randn(1000, 1);  % 正規分布乱数

figure;
subplot(2, 1, 1);
hist(data, 50);
title('ヒストグラム');

subplot(2, 1, 2);
boxplot(data);
title('ボックスプロット');

% 数値計算の例
% 連立方程式 Ax = b の解
A = [2, 1, -1; 1, 3, 2; 1, 0, 1];
b = [8; 13; 5];
x = A \ b;  % 連立方程式の解
disp('連立方程式の解:');
disp(x);

% 固有値・固有ベクトル
[V, D] = eig(A);
disp('固有値:');
disp(diag(D));

信号処理とフィルタリング

% 信号生成
fs = 1000;  % サンプリング周波数
t = 0:1/fs:1-1/fs;  % 時間ベクトル

% 複合信号(50Hz + 120Hz + ノイズ)
signal = sin(2*pi*50*t) + 0.5*sin(2*pi*120*t) + 0.2*randn(size(t));

% FFT(高速フーリエ変換)
Y = fft(signal);
f = (0:length(Y)-1)*fs/length(Y);

% プロット
figure;
subplot(2, 1, 1);
plot(t(1:200), signal(1:200));
title('時間領域信号');
xlabel('時間 [s]');
ylabel('振幅');

subplot(2, 1, 2);
plot(f(1:length(f)/2), abs(Y(1:length(Y)/2)));
title('周波数スペクトラム');
xlabel('周波数 [Hz]');
ylabel('振幅');

% ローパスフィルタ設計
fc = 80;  % カットオフ周波数
[b, a] = butter(4, fc/(fs/2));  % 4次バターワースフィルタ

% フィルタリング
filtered_signal = filter(b, a, signal);

figure;
plot(t(1:500), signal(1:500), 'b', 'LineWidth', 1);
hold on;
plot(t(1:500), filtered_signal(1:500), 'r', 'LineWidth', 2);
title('フィルタリング結果');
legend('元信号', 'フィルタ後', 'Location', 'best');

特徴的な機能

Simulinkとの連携

% Simulinkモデルの制御
model_name = 'my_model';

% モデルの読み込み
% load_system(model_name);

% パラメータの設定
% set_param([model_name '/Gain'], 'Gain', '2.5');

% シミュレーション実行
% sim(model_name);

% 結果の取得
% simout = sim(model_name, 'ReturnWorkspaceOutputs', 'on');

disp('Simulinkとの連携機能');

App Designerによる GUI作成

% シンプルなGUIアプリの例
function simple_calculator
    % フィギュアの作成
    fig = uifigure('Name', '簡単な計算機', 'Position', [100, 100, 300, 200]);
    
    % UI要素の作成
    num1_field = uieditfield(fig, 'numeric', 'Position', [50, 150, 100, 22], 'Value', 0);
    num2_field = uieditfield(fig, 'numeric', 'Position', [170, 150, 100, 22], 'Value', 0);
    
    add_btn = uibutton(fig, 'push', 'Text', '加算', 'Position', [50, 100, 50, 22]);
    subtract_btn = uibutton(fig, 'push', 'Text', '減算', 'Position', [110, 100, 50, 22]);
    multiply_btn = uibutton(fig, 'push', 'Text', '乗算', 'Position', [170, 100, 50, 22]);
    divide_btn = uibutton(fig, 'push', 'Text', '除算', 'Position', [230, 100, 50, 22]);
    
    result_field = uieditfield(fig, 'numeric', 'Position', [110, 50, 100, 22], 'Editable', 'off');
    
    % コールバック関数の設定
    add_btn.ButtonPushedFcn = @(src, event) calculate_result('+');
    subtract_btn.ButtonPushedFcn = @(src, event) calculate_result('-');
    multiply_btn.ButtonPushedFcn = @(src, event) calculate_result('*');
    divide_btn.ButtonPushedFcn = @(src, event) calculate_result('/');
    
    function calculate_result(operation)
        num1 = num1_field.Value;
        num2 = num2_field.Value;
        
        switch operation
            case '+'
                result = num1 + num2;
            case '-'
                result = num1 - num2;
            case '*'
                result = num1 * num2;
            case '/'
                if num2 ~= 0
                    result = num1 / num2;
                else
                    result = NaN;
                    uialert(fig, 'ゼロで割ることはできません', 'エラー');
                end
        end
        
        result_field.Value = result;
    end
end

並列計算(Parallel Computing Toolbox)

% 並列プールの開始
% parpool('local', 4);  % 4つのワーカーで並列プール開始

% parforによる並列処理
n = 1000000;
data = rand(n, 1);
results = zeros(n, 1);

% 通常のforループ
tic;
for i = 1:n
    results(i) = sqrt(data(i)) + log(data(i) + 1);
end
serial_time = toc;

% 並列forループ
tic;
parfor i = 1:n
    results(i) = sqrt(data(i)) + log(data(i) + 1);
end
parallel_time = toc;

fprintf('シリアル処理時間: %.4f秒\n', serial_time);
fprintf('並列処理時間: %.4f秒\n', parallel_time);
fprintf('高速化率: %.2fx\n', serial_time/parallel_time);

% 並列プールの終了
% delete(gcp('nocreate'));

バージョン

バージョンステータス主要な特徴リリース年
MATLAB R2024aLatestAI機能強化、パフォーマンス改善2024
MATLAB R2023bCurrentLive Editorの改善、App Designer機能追加2023
MATLAB R2023aCurrent新しいグラフィック機能、数値計算改善2023
MATLAB R2022bCurrent関数型プログラミング機能拡張2022
MATLAB R2022aCurrent新しいデータ型とアルゴリズム2022
MATLAB R2021bSupported性能向上、新しいツールボックス2021

参考ページ

公式ドキュメント

学習リソース

専門ツールボックス