LEARN X · ЗА 15 МИН

MATLAB

MATLAB за 15 минут: весь язык на одной странице через закомментированный код — матрицы, векторы, операции, индексация, циклы, функции, графика.

MATLAB (MATrix LABoratory) — язык и среда для матричных и научных вычислений. Здесь всё — это матрица, а большинство задач решается без явных циклов, через векторные операции. Ниже — весь язык в комментариях рабочего кода.

Вывод и комментарии

% Это однострочный комментарий — начинается с процента
%{
  Это блочный комментарий.
  Может занимать несколько строк.
%}

disp('Привет, мир!')        % disp — выводит значение без имени переменной
disp(42)                    % выведет: 42

% fprintf — форматированный вывод (как printf в C)
fprintf('Число: %d\n', 42)         % %d — целое, \n — перевод строки
fprintf('Пи примерно %.4f\n', pi)  % %.4f — дробное с 4 знаками
fprintf('Текст: %s\n', 'hello')    % %s — строка

% Если в конце строки НЕТ точки с запятой — результат печатается в консоль
5 + 3       % ans = 8  (ans — переменная-результат по умолчанию)
5 + 3;      % точка с запятой подавляет вывод — ничего не печатается

Переменные

Имена переменных не объявляются заранее. Любое значение — это на самом деле матрица (число — матрица 1×1).

x = 10;             % скаляр (на деле матрица 1x1)
name = 'Анна';      % строка в одинарных кавычках (char-массив)
flag = true;        % логическое значение

% MATLAB чувствителен к регистру: x и X — разные переменные
X = 99;

% Несколько присваиваний — через запятую/точку с запятой
a = 1; b = 2; c = 3;

who                 % список текущих переменных
class(x)            % тип значения: 'double'
clear x             % удалить переменную x
% clear all         % удалить все переменные

Матрицы и векторы

% Вектор-строка: элементы через пробел или запятую
row = [1 2 3 4];
row = [1, 2, 3, 4];

% Вектор-столбец: элементы через точку с запятой
col = [1; 2; 3; 4];

% Матрица 2x3: строки разделяются ;
M = [1 2 3;
     4 5 6];

% Двоеточие — генератор диапазона: начало:шаг:конец
v = 1:5;          % [1 2 3 4 5]
v = 0:2:10;       % [0 2 4 6 8 10]  (шаг 2)
v = 10:-1:1;      % обратный отсчёт от 10 до 1

% Доступ к элементам — индексация С ЕДИНИЦЫ (не с нуля!)
M(1, 2)           % элемент: 1-я строка, 2-й столбец => 2
M(2, 3)           % => 6
M(end, end)       % end — последний индекс => 6

% Конкатенация матриц
A = [1 2];
B = [3 4];
[A B]             % горизонтально => [1 2 3 4]
[A; B]            % вертикально   => [1 2; 3 4]

Операции с матрицами

Ключевое отличие: операции бывают матричные и поэлементные (с точкой перед знаком).

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

% Поэлементные операции — точка перед оператором
A .* B            % поэлементное умножение => [5 12; 21 32]
A ./ B            % поэлементное деление
A .^ 2            % каждый элемент в квадрат => [1 4; 9 16]

% Матричные операции — по правилам линейной алгебры
A * B             % матричное умножение строк на столбцы
A ^ 2             % A*A (матричное возведение в степень)

% Транспонирование — апостроф '
A'                % строки становятся столбцами

% Скаляр применяется к каждому элементу автоматически
A + 10            % прибавить 10 ко всем => [11 12; 13 14]
2 * A             % умножить все на 2

Индексация и срезы

M = [10 20 30;
     40 50 60;
     70 80 90];

M(2, :)           % вся 2-я строка  => [40 50 60]  (: значит «все»)
M(:, 3)           % весь 3-й столбец => [30; 60; 90]
M(1:2, 2:3)       % подматрица: строки 1-2, столбцы 2-3

% Линейная индексация — по столбцам сверху вниз
M(4)              % => 20 (4-й элемент при обходе по столбцам)

% Логическая индексация — мощный приём MATLAB
v = [5 -2 8 -1 3];
v(v > 0)          % выбрать положительные => [5 8 3]
v(v < 0) = 0;     % заменить отрицательные на 0 => [5 0 8 0 3]

find(v > 4)       % индексы элементов, больших 4

Операторы и условия

% Сравнения: ==  ~=  <  >  <=  >=
% Логические: & (и), | (или), ~ (не)
% Для скаляров с коротким замыканием: &&  ||

x = 7;
if x > 10
    disp('больше 10')
elseif x > 5
    disp('от 6 до 10')      % сработает эта ветка
else
    disp('5 или меньше')
end

% switch — выбор по значению
color = 'green';
switch color
    case 'red'
        disp('красный')
    case {'green', 'lime'}      % несколько значений в ячейке
        disp('зелёный')
    otherwise
        disp('другой цвет')
end

Циклы

% for — перебор элементов вектора
for i = 1:5
    fprintf('i = %d\n', i)
end

% for может идти по любому вектору
for val = [10 20 30]
    disp(val)
end

% while — пока условие истинно
n = 1;
while n < 100
    n = n * 2;          % 1, 2, 4, ... до 128
end

% break — выйти из цикла, continue — к следующей итерации
for k = 1:10
    if k == 3
        continue        % пропустить 3
    end
    if k == 6
        break           % остановиться на 6
    end
    disp(k)             % выведет 1 2 4 5
end

Функции

Функции обычно хранятся в файлах имя.m. Можно возвращать несколько значений.

% Объявление: function [выходы] = имя(входы)
function y = square(x)
    y = x .^ 2;         % результат присваивается выходной переменной
end

% Несколько выходных значений
function [s, p] = sum_and_prod(a, b)
    s = a + b;          % сумма
    p = a * b;          % произведение
end

% Вызов с захватом нескольких выходов
[s, p] = sum_and_prod(3, 4);    % s = 7, p = 12

% Анонимные функции — через @(аргументы) выражение
f = @(x) x.^2 + 1;
f(3)                    % => 10

g = @(x, y) x + y;
g(2, 5)                 % => 7

% Анонимки удобны для передачи в другие функции
arrayfun(@(x) x*2, [1 2 3])     % => [2 4 6]

Строки и массивы ячеек

% Классическая строка — в одинарных кавычках (массив символов)
s = 'MATLAB';
length(s)               % => 6
s(1)                    % => 'M'  (индексация с 1)
upper(s)                % => 'MATLAB' в верхнем регистре
[s ' rocks']            % склейка строк => 'MATLAB rocks'

% Современный строковый тип — двойные кавычки (с R2017a)
str = "привет";
strlength(str)          % длина строки

% Полезные функции для строк
strcat('a', 'b', 'c')   % => 'abc'
strsplit('a,b,c', ',')  % => {'a'} {'b'} {'c'}
str2num('42')           % строка -> число
num2str(3.14)           % число -> строка

% Массив ячеек {} — хранит элементы РАЗНЫХ типов
c = {1, 'текст', [1 2 3]};
c{1}                    % фигурные скобки достают содержимое => 1
c{2}                    % => 'текст'
c{3}                    % => [1 2 3]

Встроенные функции

v = [3 1 4 1 5 9 2 6];

sum(v)              % сумма всех элементов => 31
mean(v)             % среднее арифметическое
max(v)              % максимум => 9
min(v)              % минимум => 1
prod(v)             % произведение всех элементов
sort(v)             % сортировка по возрастанию
sort(v, 'descend')  % по убыванию

size(M)             % размеры матрицы [строки столбцы]
length(v)           % длина (наибольшая размерность)
numel(M)            % общее число элементов

% Создание типовых матриц
zeros(2, 3)         % матрица 2x3 из нулей
ones(3)             % матрица 3x3 из единиц
eye(3)              % единичная матрица 3x3 (1 на диагонали)
rand(2, 2)         % случайные числа из [0, 1)

% linspace — N равномерных точек на отрезке [a, b]
linspace(0, 1, 5)   % => [0 0.25 0.5 0.75 1]

Графика

x = linspace(0, 2*pi, 100);   % 100 точек от 0 до 2π
y = sin(x);

plot(x, y)                    % построить график y(x)

hold on                       % не стирать предыдущий график
plot(x, cos(x), 'r--')        % красная пунктирная линия
hold off

xlabel('x')                   % подпись оси X
ylabel('y')                   % подпись оси Y
title('Синус и косинус')      % заголовок
legend('sin', 'cos')          % легенда
grid on                       % сетка

% Другие виды графиков
% bar(v)        — столбчатая диаграмма
% scatter(x, y) — точечный график
% histogram(v)  — гистограмма
% subplot(2,1,1) — несколько графиков в одном окне

Структуры

Структура struct хранит именованные поля — удобно для группировки разнородных данных.

% Создание структуры через присваивание полей
student.name = 'Иван';
student.age = 20;
student.grades = [5 4 5];

student.name            % доступ к полю => 'Иван'
mean(student.grades)    % среднее по оценкам

% Создание сразу через функцию struct
p = struct('x', 10, 'y', 20);
p.x                     % => 10

% Массив структур — несколько однотипных записей
people(1).name = 'Анна';
people(2).name = 'Борис';
people(2).name          % => 'Борис'

fieldnames(student)     % список имён полей
isfield(student, 'age') % проверка наличия поля => true
rmfield(student, 'age') % вернуть структуру без поля age
Поддержать проект