Матрицы и базовые операции
Создание матриц и векторов
MATLAB (MATrix LABoratory) рассматривает все переменные как матрицы. Векторы — это матрицы 1xN или Nx1. Используйте пробелы или запятые для разделения элементов в строке, точки с запятой — для новых строк. zeros, ones, eye, rand и magic создают стандартные тестовые матрицы. Оператор двоеточия start:step:stop генерирует диапазоны (по умолчанию шаг 1). linspace(a, b, n) создаёт n равноотстоящих точек — идеально для осей графиков.
% row vector
v = [1 2 3 4 5];
% column vector (semicolon = new row)
c = [1; 2; 3];
% 3x3 matrix
A = [1 2 3; 4 5 6; 7 8 9];
% special matrices
Z = zeros(3); % 3x3 zeros
O = ones(2, 4); % 2x4 ones
I = eye(3); % 3x3 identity
R = rand(2, 3); % 2x3 uniform random
N = randn(4); % 4x4 normal random
M = magic(4); % 4x4 magic square
D = diag([1 2 3]); % diagonal matrix
% linear spacing
l = linspace(0, 1, 5); % [0 0.25 0.5 0.75 1]
r = 0:0.5:2; % [0 0.5 1 1.5 2]Индексация и срезы матриц
MATLAB использует индексацию с 1 (не с 0). Двоеточие : означает «все» — A(:,2) это весь второй столбец. A(1:3, :) выбирает строки 1-3. 'end' ссылается на последний индекс в этом измерении. Логическая индексация (A(A > 5)) чрезвычайно мощная — она извлекает или изменяет элементы, соответствующие условию. find возвращает индексы ненулевых/истинных элементов, а с двумя выходами даёт строку и столбец отдель но.
A = magic(4); % 4x4 magic square
% single element (1-indexed!)
A(2, 3) % row 2, col 3
% entire row or column
A(1, :) % first row (all columns)
A(:, 2) % second column (all rows)
% submatrix
A(1:2, 2:4) % rows 1-2, cols 2-4
% linear indexing (column-major)
A(5) % 5th element counting down columns
% end keyword
A(end, :) % last row
A(:, end-1) % second-to-last column
% logical indexing
A(A > 10) % all elements > 10 (as vector)
A(A > 10) = 0; % set large elements to 0
% find indices
[r, c] = find(A == 16) % row and col of value 16Матричная арифметика
Точка перед оператором (.*) делает его поэлементным вместо матричного — это источник №1 ошибок у новичков. A*B это матричное умножение; A.*B умножает соответствующие элементы. Оператор обратной косой черты (\) решает линейные системы эффективно и точно (LU-разложение) — всегда предпочитайте x = A\b вместо inv(A)*b. Апостроф (') транспонирует; для комплексных матриц используйте .' для транспонирования без сопряжения.
A = [1 2; 3 4];
B = [5 6; 7 8];
% matrix operations
C = A + B; % addition
D = A - B; % subtraction
E = A * B; % matrix multiplication
F = A'; % transpose
G = A^2; % matrix power (A * A)
% element-wise operations (use the dot!)
H = A .* B; % element-wise multiply
I = A ./ B; % element-wise divide
J = A .^ 2; % element-wise power
K = 2 * A; % scalar multiply
% matrix functions
det(A) % determinant
inv(A) % inverse
pinv(A) % pseudo-inverse
rank(A) % rank
trace(A) % trace (sum of diagonal)
% solving linear systems Ax = b
b = [5; 11];
x = A \ b; % left division: solves A*x = b
x = inv(A) * b; % equivalent but slowerМанипуляции с матрицами
Конкатенация [A B] (пробелы) объединяет по горизонтали; [A; B] (точки с запятой) по вертикали — зеркально синтаксису создания строк. reshape заполняет по столбцам (вниз, затем поперёк). flipud/fliplr/rot90 переориентируют матрицы. repmat размножает матрицу в виде сетки. Установка строки или столбца в [] удаляет его. size возвращает размеры, length — наибольшую размерность, numel — общее количество элементов.
A = [1 2; 3 4];
B = [5 6; 7 8];
% concatenation
C = [A B]; % horizontal: [1 2 5 6; 3 4 7 8]
D = [A; B]; % vertical: 4x4
% reshape
E = reshape(1:12, 3, 4); % 3x4 matrix from 1..12
% flip and rotate
F = flipud(A); % flip up-down
G = fliplr(A); % flip left-right
H = rot90(A); % rotate 90 degrees
% repmat (tile)
I = repmat([1 2], 2, 3); % repeat [1 2] in a 2x3 grid
% size and length
[m, n] = size(A); % m=2, n=2
len = length(A); % max dimension = 2
num = numel(A); % total elements = 4
% remove rows/cols
A(2, :) = []; % delete row 2
A(:, 1) = []; % delete column 1Поэлементные функции и векторизация
Сила MATLAB — в векторизации: применении операций к целым массивам сразу, что выполняется в оптимизированном C/Fortran под капотом. sin, exp, sqrt и т.д. работают поэлементно автоматически. sum/prod/max/min работают по столбцам по умолчанию (размерность 1); укажите размерность 2 для строк. A(:) вытягивает матрицу в вектор. Всегда предпочитайте векторизованные операции циклам for ради производительности — они могут быть в 10-100 раз быстрее.
% math functions operate element-wise
x = 0:0.1:2*pi;
y = sin(x); % sine of each element
z = exp(x); % exponential
w = sqrt(x); % square root
% rounding
round(3.7) % 4
floor(3.7) % 3
ceil(3.2) % 4
fix(-3.7) % -3 (toward zero)
% sums and products along dimensions
A = magic(3);
sum(A) % sum of each column (row vector)
sum(A, 2) % sum of each row (column vector)
sum(A(:)) % sum of ALL elements
prod(A) % product of each column
cumsum(A) % cumulative sum
% min, max, sort
[v, i] = max(A(:)) % max value and its index
sort(A, 'descend') % sort each column descending
% AVOID loops — vectorize!
% BAD: for i=1:1000, y(i)=sin(i); end
% GOOD:
i = 1:1000;
y = sin(i); % fast, vectorizedУправляющий поток и логика
If / Elseif / Else
MATLAB использует if/elseif/else/end (обратите внимание: elseif — одно слово). Логические операторы: && (скалярное И), || (скалярное ИЛИ), & (поэлементное И), | (поэлементное ИЛИ), ~ (НЕ, а не !). Для сравнения строк используйте strcmp/strcmpi (без учёта регистра) — оператор == работает только с символьными массивами одинаковой длины. Всегда завершайте блоки 'end'.
score = 85;
if score >= 90
grade = 'A';
elseif score >= 80
grade = 'B';
elseif score >= 70
grade = 'C';
else
grade = 'F';
end
disp(grade); % B
% logical operators: && (and), || (or), ~ (not)
if x > 0 && x < 10
disp('in range');
end
% compare strings with strcmp
if strcmp(name, 'Alice')
disp('hi Alice');
endЦиклы For и While
for проходит по каждому столбцу заданного выражения (для векторов — по каждому элементу). while выполняется, пока условие истинно. ВСЕГДА предварительно выделяйте массивы перед циклами (result = zeros(1,N)) — рост массива в цикле вызывает перераспределение на каждой итера ции и катастрофически медленный. Оператор двоеточия 1:5 создаёт [1 2 3 4 5]. fprintf выводит форматированный текст (как printf в C).
% for loop over a range
for i = 1:5
fprintf('i = %d\n', i);
end
% iterate over a vector
v = [10 20 30];
for val = v
disp(val);
end
% nested loop over a matrix
A = zeros(3, 3);
for r = 1:3
for c = 1:3
A(r, c) = r * c;
end
end
% while loop
n = 10;
while n > 1
n = n / 2;
fprintf('%.2f\n', n);
end
% preallocate for speed (IMPORTANT!)
result = zeros(1, 1000);
for i = 1:1000
result(i) = i^2;
endSwitch и Break/Continue
switch сопоставляет значение с метками case — break не нужен (в отличие от C/Java). case может принимать cell array для нескольких значений. otherwise — значение по умолчанию. break выходит из внутреннего цикла; continue переходит к следующей итерации. try/catch элегантно обрабатывает ошибки; ME — объект MException с .message и .identifier. В MATLAB нет тернарного оператора — используйте if/else или inline-функции.
% switch statement
method = 'linear';
switch method
case 'linear'
disp('using linear');
case 'cubic'
disp('using cubic');
case {'nearest', 'spline'}
disp('using nearest or spline');
otherwise
disp('unknown method');
end
% break and continue
for i = 1:10
if i == 5
break % exit the loop entirely
end
if mod(i, 2) == 0
continue % skip to next iteration
end
disp(i); % prints 1 3
end
% try-catch for error handling
try
x = 1 / 0; % may error
catch ME
fprintf('Error: %s\n', ME.message);
endЛогические операции и индексация
Логическая индексация — киллер-фича MATLAB: A(condition) выбирает элементы, где логический массив истинен. ~= означает «не равно» (не !=). & и | — поэлементные; && и || — короткозамкнутые (только скалярные, предпочтительны в условиях if). find возвращает линейные индексы истинных значений. any/all проверяют, есть ли хотя бы один/все элементы истинны, опционально вдоль размерности. Семейство is* проверяет типы и специальные значения (NaN, Inf).
A = [1 2 3 4 5 6 7 8 9 10];
% comparison operators
A > 5 % logical array
A == 5
A ~= 5 % not equal (NOT !=)
A >= 3 & A <= 7 % element-wise AND
A < 3 | A > 7 % element-wise OR
% logical indexing (powerful!)
A(A > 5) % [6 7 8 9 10]
A(A > 5) = 0; % set elements > 5 to 0
A(mod(A, 2) == 0) % even numbers
% find indices
idx = find(A > 5); % indices of elements > 5
[r, c] = find(A > 5); % row and col (for matrices)
% any and all
any(A > 5) % true if ANY element > 5
all(A > 0) % true if ALL elements > 0
any(A > 5, 2) % per row
% is functions
isnan(x); isinf(x); isfinite(x);
isnumeric(x); ischar(x); iscell(x);Строки и форматирование
В MATLAB два строковых типа: символьные массивы ('text', устаревшие) и строковые скаляры ("text", R2017+). Строковые скаляры удобнее для манипуляций. sprintf возвращает форматированную строку; fprintf выводит в консоль или файл. Частые спецификаторы формата: %s (строка), %d (целое), %f (число с плавающей точкой), %.2f (2 знака после запятой), %e (научный). strsplit/strjoin обрабатывают списки с разделителями. num2str/mat2str преобразуют числа в строки.
% string creation
s1 = 'Hello'; % char array
s2 = "World"; % string scalar (R2017+)
% concatenation
greeting = [s1 ', ' s2 '!']; % char array concat
full = s1 + " " + s2; % string concat
% formatting
name = 'Alice';
age = 30;
fprintf('Name: %s, Age: %d\n', name, age);
str = sprintf('Pi is %.2f', pi); % returns string
% common string functions
upper('hello') % HELLO
lower('WORLD') % world
strlength("hello") % 5 (string)
length('hello') % 5 (char array)
strcmp('a', 'a') % true
strfind('hello', 'll') % 3 (index)
strrep('cat', 'c', 'b') % bat
strsplit('a,b,c', ',') % {'a','b','c'}
strjoin({'a','b'}, '-') % a-b
num2str(42) % '42'Функции и скрипты
Определение функций
Функции должны находиться в файле с тем же именем (add.m для функции add) или в конце файла скрипта. Первая строка — объявление функции. Функции имеют собственное рабочее пространство (отдельное от базового). nargin/nargout позволяют обрабатывать необязательные аргументы — nargin считает фактические входы. Несколько выходов захватываются как [a, b] = func(). Если вы вызываете с меньшим числом выходов, лишние отбрасываются.
% function in a file named 'add.m'
function result = add(a, b)
% ADD returns the sum of a and b
result = a + b;
end
% with multiple inputs and outputs
function [mn, mx, avg] = stats(v)
mn = min(v);
mx = max(v);
avg = mean(v);
end
% calling functions
s = add(3, 4); % 7
[lo, hi, mu] = stats([1 2 3 4 5]);
% capture only first output
minimum = stats([1 2 3]); % gets mn only
% nargin and nargout (number of args)
function y = power(x, n)
if nargin < 2
n = 2; % default value
end
y = x .^ n;
endАнонимные и inline-функции
Анонимные функции (@(args) expr) — быстрые однострочные функции, определённые inline — идеальны для передачи в р ешатели (fzero, integral, ode45) без создания файлов. Они захватывают переменные рабочего пространства на момент создания. Дескрипторы функций (@sin) позволяют передавать встроенные или пользовательские функции как аргументы. Это необходимо для численных вычислений: integral(@(x) f(x), a, b) интегрирует любую заданную вами функцию.
% anonymous function (one-liner, no file needed)
square = @(x) x .^ 2;
square(5) % 25
square([1 2 3]) % [1 4 9]
% with multiple inputs
add = @(a, b) a + b;
add(3, 4) % 7
% capture variables from workspace
c = 10;
addc = @(x) x + c;
addc(5) % 15
% function handle to built-in
f = @sin;
f(pi/2) % 1
% pass functions as arguments
result = integral(@(x) x.^2, 0, 1); % integrate x^2 from 0 to 1
result = fzero(@(x) x^2 - 2, 1); % find root near 1
% array of function handles
funs = {@sin, @cos, @tan};
funs{1}(0) % 0Скрипты и Live Scripts
Скрипты — последовательности команд, выполняемые в базовом рабочем пространстве (в отличие от функций с изолированными пространствами). Маркер %% создаёт «ячейки» (секции), которые можно запускать отдельно по Ctrl+Enter — отлично для инкрементальной разработки. Live Scripts (.mlx) похожи на Jupyter-блокноты: они объединяют код, форматированный текст, уравнения и встроенные графики в одном интерактивном документе. Предпочитайте функции скриптам для переиспользуемого кода.
% A script is just a sequence of commands in a .m file
% It shares the base workspace
% script: analyze_data.m
data = load('data.mat');
cleaned = data.values(data.values > 0);
mean_val = mean(cleaned);
fprintf('Mean: %.2f\n', mean_val);
plot(cleaned);
title('Cleaned Data');
% sections (cells) with %%
%% Initialize
x = linspace(0, 2*pi, 100);
%% Plot
plot(x, sin(x));
%% Analyze
disp(mean(sin(x)));
% Run a section: Ctrl+Enter (in editor)
% Live Scripts (.mlx): rich text, inline plots, equationsВложенные и локальные функции
Скрипты могут содержать локальные функции в конце файла (начиная с R2016b) — они видны только внутри этого файла. Вложенные функции (определённые внутри другой функции) разделяют рабочее пространство родителя, поэтому могут читать и изменять его переменные — полезно для колбэков и аккумуляторов, но может усложнить понимание кода. Локальные функции в файлах функций — это помощники, видимые только внутри этого файла. Используйте локальные функции для организации скриптов без создания множества файлов.
% local functions in a script (must be at the end)
% main_script.m
x = 1:10;
y = process(x);
disp(y);
function r = process(v)
r = normalize(scale(v)); % calls another local function
end
function s = scale(v)
s = v * 10;
end
function n = normalize(v)
n = v / max(v);
end
% nested function (inside another function)
function outer(x)
y = 0;
function inner()
y = y + x; % can access outer's variables
end
inner();
disp(y);
endОбласть видимости переменных и global
MATLAB передаёт аргументы по значению (copy-on-modify), поэтому функции не могут случайно изменить переменные вызывающей стороны — в отличие от C/Python. Используйте global для действительно разделяемого состояния (объявляйте в каждой функции, которая его использует), но предпочитайте передачу аргументов. persistent-переменные сохраняют значение между вызовами функции (как static в C) — полезно для счётчиков, кэшей или мемоизации. Инициализируйте persistent-переменные с проверкой isempty при первом вызове. Избегайте global в пользу возврата из функций или вложенных функций.
% base workspace variables
x = 10;
% functions have their OWN workspace
function y = myfunc()
% x is NOT accessible here
y = 5;
end
% pass by value (modifications don't affect caller)
function y = modify(v)
v = v * 2; % local copy
y = v;
end
a = 5;
b = modify(a); % b=10, a still 5
% global variables (use sparingly!)
global COUNTER
COUNTER = 0;
function increment()
global COUNTER
COUNTER = COUNTER + 1;
end
% persistent variables (like static in C)
function counter()
persistent count
if isempty(count)
count = 0;
end
count = count + 1;
disp(count);
endСтруктуры данных
Cell-массивы
Cell-массивы — контейнер MATLAB для разнотипных данных (как списки в Python). Используйте фигурные скобки {} для доступа к СОДЕРЖИМОМУ ячейки, а круглые скобки () — для получения ячейки (полезно для срезов). Это различие критично: c{1} даёт строку; c(1) даёт ячейку, содержащую строку. Ячейки необходимы для работы со строками разной длины, матрицами переменного размера и рваными данными. num2cell/mat2cell преобразуют между числовыми массивами и ячейками.
% cell arrays hold mixed data types
c = {'Alice', 30, [1 2 3], magic(2)};
% access with {} (content) vs () (cell)
c{1} % 'Alice' (the string itself)
c(1) % {'Alice'} (a 1x1 cell)
c{3}(2) % 2 (second element of third cell)
% modify and append
c{2} = 31;
c{end+1} = 'new'; % append
c{5} = 'skip'; % auto-fills gaps with []
% multi-dimensional cell array
c2 = {'a', 'b'; 'c', 'd'}; % 2x2 cell
% iterate over cells
for i = 1:numel(c)
disp(c{i});
end
% convert: cell2mat, mat2cell, num2cell
nums = num2cell(1:5); % {1, 2, 3, 4, 5}Structs и таблицы
Structs группируют связанные данные с именованными полями — как объекты без методов. Таблицы (R2013+) — эквивалент датафреймов в MATLAB: колонко-ориентированные, с именованными переменными и именами строк. Таблицы идеальны для данных CSV/Excel. Доступ к столбцам по имени (T.ages) или индексу. Логическая индексация работает на строках: T(T.age > 25, :) фильтрует строки. summary() даёт статистику по каждому столбцу. Таблицы интегрируются с readtable/writetable для ввода-вывода данных.
% struct: named fields with any data
user.name = 'Alice';
user.age = 30;
user.scores = [90 85 88];
disp(user.name); % Alice
% struct constructor
s = struct('name', 'Bob', 'age', 25, 'active', true);
% array of structs
users(1) = struct('name', 'Alice', 'age', 30);
users(2) = struct('name', 'Bob', 'age', 25);
disp(users(2).name); % Bob
% table (like a dataframe) — great for tabular data
names = {'Alice'; 'Bob'; 'Carol'};
ages = [30; 25; 28];
scores = [90; 85; 88];
T = table(names, ages, scores);
% access table columns
T.ages % column as array
T(:, 2) % column as table
T(1:2, :) % first 2 rows
T.age > 26 % logical indexing
T(T.age > 26, :) % rows where age > 26
% summary statistics
summary(T)Строковые массивы и обработка символов
Современный MATLAB (R2017+) предпочитает строковые массивы ("text") символьным массивам ('text'). Строковые массивы поддерживают векторизованные операции: strlength, +, split, join, contains, matches, replace работают поэлементно. Символьные массивы всё ещё распространены в старом коде и нужны для некоторых функций. Используйте строковые массивы для коллекций текста; они естественно обрабатывают разную длину (в отличие от символьных массивов, которым нужны выравнивание или ячейки).
% string array (R2017+) — recommended for text
names = ["Alice", "Bob", "Carol"];
names(1) % "Alice"
names' % column string array
strlength(names) % [5 3 5]
% char array (legacy)
c = 'Hello World';
c(1:5) % 'Hello'
size(c) % [1 11]
% cell array of char vectors (legacy mixed-length)
old = {'Alice', 'Bob', 'Carol'};
% convert between types
s = string('hello'); % char -> string
c = char("hello"); % string -> char
cellarr = cellstr(names); % string array -> cell of char
% combine and split
full = "Alice" + " " + "Smith"; % "Alice Smith"
parts = split("a,b,c", ","); % ["a", "b", "c"]
joined = join(["a" "b" "c"], "-"); % "a-b-c"
% pattern matching
matches(names, 'A*') % logical: [true false false]
contains(names, 'li') % [true false false]
replace("hello", 'l', 'L') % "heLLo"Containers.Map и множества
containers.Map — словарь key-value в MATLAB (хеш-таблица) — полезен для таблиц поиска и конфигурации. Ключами могут быть строки или числа. isKey проверяет существование; keys/values извлекают все. Операции над множествами (union, intersect, setdiff, setxor, ismember) работают с числовыми массивами и cell-массивами строк. ismember проверяет принадлежность и возвращает логический массив — отлично для фильтрации. Они дополняют логическую индексацию для манипуляции данными.
% map (dictionary / hash table)
m = containers.Map;
m('name') = 'Alice';
m('age') = 30;
m('scores') = [90 85];
% access
m('name') % 'Alice'
isKey(m, 'name') % true
keys(m) % {'age', 'name', 'scores'}
values(m) % {30, 'Alice', [90 85]}
remove(m, 'age');
% create with initial values
m2 = containers.Map({'a','b','c'}, {1, 2, 3});
% set operations
A = [1 2 3 4 5];
B = [4 5 6 7 8];
union(A, B) % [1 2 3 4 5 6 7 8]
intersect(A, B) % [4 5]
setdiff(A, B) % [1 2 3]
setxor(A, B) % [1 2 3 6 7 8]
ismember(3, A) % true
ismember([1 6], A) % [true false]Categorical и datetime
categorical-массивы эффективно хранят текстовые данные (как целые с меткой) и поддерживают упорядочивание — идеальны для ответов опросов, рейтингов или любого фиксированного набора категорий. datetime/duration (R2014+) заменяют устаревшие datenum/datestr современной системой дат с учётом часовых поясов. Арифметика дат интуитивна: добавляйте days(), hours(), minutes(). Эти типы интегрируются с таблицами и построением графиков для анализа временных рядов.
% categorical data (efficient for repeated strings)
colors = categorical({'red', 'blue', 'red', 'green', 'blue'});
categories(colors) % list of categories
summary(colors) % count per category
ord = categorical({'low','med','high'}, ...
{'low','med','high'}, 'Ordinal', true);
ord(1) < ord(2) % true (ordered)
% datetime
t = datetime('now') % current date and time
t = datetime(2024, 1, 15)
t.Format = 'yyyy-MM-dd HH:mm:ss';
% duration
d = duration(2, 30, 0); % 2 hours 30 min
d = hours(2) + minutes(30);
% date arithmetic
t2 = t + days(7); % add a week
t2 - t % duration of 7 days
% date strings and numbers
s = datestr(t, 'yyyy-mm-dd'); % to string (legacy)
n = datenum(t); % to serial number
t = datetime(n, 'ConvertFrom', 'datenum');
% generate date range
dates = datetime(2024,1,1) + days(0:6); % one weekПостроение графиков и визуализация
Базовые 2D-графики
plot() — основная функция 2D-построения. Третий аргумент задаёт цвет и стиль ('b-' = синяя сплошная). hold on позволяет наложить несколько графиков; hold off снимает. Всегда подписывайте оси и добавляйте легенду. axis([xmin xmax ymin ymax]) устанавливает пределы. saveas/print экспортируют фигуры — print с -r300 даёт 300 DPI. gcf возвращает дескриптор текущей фигуры. Опция 'Location','best' автоматически размещает легенду.
x = linspace(0, 2*pi, 100);
% line plot
plot(x, sin(x), 'b-', 'LineWidth', 2);
hold on;
plot(x, cos(x), 'r--', 'LineWidth', 2);
hold off;
% labels and legend
xlabel('x (radians)');
ylabel('amplitude');
title('Sine and Cosine');
legend('sin(x)', 'cos(x)', 'Location', 'best');
grid on;
% line styles: b- blue solid, r-- red dashed
% g: green dotted, m-. magenta dash-dot
% markers: o circle, * star, s square, + plus
% axis control
axis([0 2*pi -1.5 1.5]); % [xmin xmax ymin ymax]
xlim([0 2*pi]);
ylim([-1.5 1.5]);
% save figure
saveas(gcf, 'plot.png');
print('-dpng', '-r300', 'plot.png');Несколько графиков и подграфики
subplot(r, c, n) делит фигуру на сетку r-by-c и выбирает n-ю ячейку для построения. tiledlayout (R2019+) — современная замена — чище интервалы и общий заголовок. nexttile переходит к следующему подграфику. yyaxis создаёт графики с двумя осями y (левой и правой) для данных с разными масштабами. Всегда сначала вызывайте figure, чтобы открыть новое окно, иначе вы перезапишете текущий график.
% subplot(rows, cols, index)
figure;
subplot(2, 2, 1);
plot(x, sin(x));
title('Sine');
subplot(2, 2, 2);
plot(x, cos(x));
title('Cosine');
subplot(2, 2, 3);
plot(x, tan(x));
title('Tangent');
ylim([-5 5]);
subplot(2, 2, 4);
plot(x, exp(-x));
title('Decay');
% tiledlayout (newer, cleaner)
figure;
t = tiledlayout(2, 2);
nexttile; plot(x, sin(x)); title('Sine');
nexttile; plot(x, cos(x)); title('Cosine');
nexttile; plot(x, tan(x)); title('Tangent');
nexttile; plot(x, exp(-x)); title('Decay');
title(t, 'Trig Functions'); % overall title
% multiple y-axes
yyaxis left; plot(x, sin(x));
yyaxis right; plot(x, 100*cos(x));Специализированные графики
В MATLAB десятки специализированных графиков: bar/barh (столбчатые), histogram (заменяет hist), scatter (с опциональным цветом/размером), pie, area, stem, stairs, compass, feather. scatter(x, y, size, color, 'filled') особенно мощная — 4-й аргумент раскрашивает точки по значению, выявляя третье измерение. histogram с 'Normalization','pdf' нормализует к плотности вероятности для сравнения с непрерывными распределениями.
% bar chart
bar([1 2 3], [10 15 7]);
bar([1 2 3; 4 5 6], 'grouped'); % grouped bars
bar([1 2 3; 4 5 6], 'stacked'); % stacked bars
% histogram
data = randn(1000, 1);
histogram(data, 30); % 30 bins
histogram(data, 'Normalization', 'pdf');
% scatter plot
x = rand(100, 1);
y = 2*x + randn(100, 1)*0.1;
scatter(x, y, 50, 'filled');
% colored scatter
scatter(x, y, 50, y, 'filled'); % color by y value
colorbar;
% pie chart
pie([30 20 50], {'A', 'B', 'C'});
% area plot
area(1:5, [1 3 2 4 5]);
% stem (discrete)
stem(0:5, [1 4 9 16 25 36]);
% boxplot (requires Statistics toolbox)
boxplot(randn(100, 3));3D-графики и поверхности
plot3 рисует 3D-параметрические линии. Для поверхностей сначала создайте сетку с meshgrid, затем вычислите Z = f(X, Y). surf рисует залитую поверхность; mesh — каркас; contour — 2D-линии уровня. colormap (jet, parula, hot, cool) управляет цветовым отображением; colorbar добавляет легенду. shading interp убирает линии сетки для плавных градиентов. view(az, el) задаёт угол камеры. 'EdgeColor','none' скрывает линии сети для чистого вида.