Всё — матрица: фундамент модели данных

Почему в MATLAB нет «просто чисел» и как это меняет способ писать код.

В MATLAB любой числовой объект — это двумерный массив. Скаляр — матрица 1×1, вектор — матрица с одной строкой или одним столбцом.

Единая модель данных

В большинстве языков число, массив и матрица — разные сущности. В MATLAB они одно и то же: матрица. Когда вы пишете x = 5, создаётся массив размером 1×1. Это не педантизм, а основа всего языка: раз всё — матрица, то одни и те же операторы и функции работают и для одного числа, и для миллиона. Функция size возвращает размер как пару «строки, столбцы», length — наибольшую размерность, numel — общее число элементов.

x = 5;
size(x)        % 1 1 — да, скаляр это матрица 1x1
v = [10 20 30 40];
size(v)        % 1 4 — вектор-строка

Вывод:

ans =
     1     1

ans =
     1     4

Векторы-строки и векторы-столбцы

Это разные объекты, и путаница между ними — источник многих ошибок. Элементы через пробел или запятую дают строку (1×n); через точку с запятой — столбец (n×1). Превратить одно в другое можно транспонированием — оператором апостроф.

row = [1 2 3];       % 1x3, вектор-строка
col = [1; 2; 3];     % 3x1, вектор-столбец
col2 = row';         % транспонирование строки в столбец

Почему это важно? Многие операции (например, матричное умножение) требуют согласованных размеров. Вектор-строка 1×3 и вектор-столбец 3×1 ведут себя по-разному, и MATLAB строго следит за размерностями.

Скаляр, вектор, матрица — один спектр

ОбъектРазмерПример
скаляр1×17
вектор-строка1×n[1 2 3]
вектор-столбецn×1[1; 2; 3]
матрицаm×n[1 2; 3 4]

Как работает под капотом

Внутри MATLAB хранит числовую матрицу как непрерывный блок памяти, заполняемый по столбцам (column-major порядок, как в Fortran). Это объясняет две вещи. Во-первых, линейная индексация A(5) обходит элементы сверху вниз по столбцам, а не слева направо по строкам. Во-вторых, операции, идущие вдоль столбцов, работают с памятью эффективнее. По умолчанию большинство функций агрегируют именно по столбцам — это согласуется с тем, как данные лежат в памяти.

Частые ошибки

  • Считать вектор-строку и вектор-столбец взаимозаменяемыми — операции с ними дают разные результаты или ошибку размерности.
  • Путать length (наибольшая размерность) и numel (всего элементов): для матрицы 3×4 это 4 и 12.
  • Ожидать, что A(5) идёт по строкам — MATLAB обходит элементы по столбцам.

Почему единая модель упрощает язык

Стоит задержаться на том, какую выгоду даёт принцип «всё — матрица». В языках, где число, вектор и матрица — разные типы, для каждого нужны свои функции и правила. В MATLAB одна функция sum работает и для скаляра, и для вектора, и для матрицы; один оператор + складывает что угодно совместимых размеров. Это резко сокращает число понятий, которые нужно держать в голове. Вы изучаете правила для матриц — и автоматически знаете их для всех частных случаев. Скаляр — просто матрица 1×1, вектор — матрица с одной короткой стороной, и никаких особых случаев.

Эта же идея объясняет, почему MATLAB так естественно ложится на математику. В линейной алгебре скаляр, вектор и матрица — части одного континуума, связанные операциями. Язык, который повторяет эту структуру, позволяет переносить формулы из учебника в код почти буквально, не отвлекаясь на упаковку данных в подходящие контейнеры.

Размерности как контракт

Привыкайте всё время держать в голове размер каждой переменной — это центральная дисциплина работы в MATLAB. Большинство ошибок здесь — не опечатки в логике, а несоответствие размеров: вы умножаете матрицу 3×2 на матрицу 4×1, и среда справедливо протестует. Опытный пользователь читает выражение и мысленно проверяет размеры на каждом шаге, как бухгалтер сводит дебет с кредитом. Функция size и инспектор Workspace — ваши главные союзники в этой проверке. Когда расчёт даёт неожиданный результат, первый вопрос почти всегда: «а каких размеров получились мои матрицы?».

Итоги

  • В MATLAB всё — матрица: скаляр 1×1, вектор 1×n или n×1.
  • Строка и столбец — разные объекты; апостроф транспонирует.
  • Память column-major: линейная индексация и агрегаты идут по столбцам.
Проверьте себя
1. Какой размер у скаляра x = 5 в MATLAB?
A0×0
B1×1
C1×5
Dскаляр не имеет размера
2. Чем отличается [1 2 3] от [1; 2; 3]?
AНичем
BПервое — строка 1×3, второе — столбец 3×1
CПервое — число, второе — массив
DВторое вызовет ошибку
3. В каком порядке MATLAB хранит элементы матрицы в памяти?
AПо строкам (row-major)
BПо столбцам (column-major)
CВ случайном порядке
DПо диагонали