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