Диапазоны: двоеточие и linspace

Самый употребимый инструмент MATLAB — двоеточие, создающее последовательности чисел.

Оператор-диапазон a:s:b строит вектор-строку от a до b с шагом s.

Двоеточие как генератор

Запись 1:5 создаёт вектор [1 2 3 4 5]. Это не цикл и не специальный объект — это сразу готовый числовой вектор. Шаг по умолчанию равен единице; чтобы задать другой, ставят его в середину: a:s:b. Шаг может быть дробным и отрицательным.

x = 1:5         % 1 2 3 4 5
y = 0:2:10      % 0 2 4 6 8 10
z = 10:-1:7     % 10 9 8 7 (обратный счёт)

Вывод:

x =
     1     2     3     4     5

y =
     0     2     4     6     8    10

z =
    10     9     8     7

linspace: фиксированное число точек

Иногда важен не шаг, а количество точек — например, чтобы построить гладкий график. Тогда удобнее linspace(a, b, n): ровно n точек, равномерно от a до b включительно. Если n опустить, берётся 100.

t = linspace(0, 1, 5)   % 0  0.25  0.5  0.75  1

Вывод:

t =
         0    0.2500    0.5000    0.7500    1.0000

Когда что выбирать

НужноИнструмент
известен шагa:s:b
известно число точекlinspace(a,b,n)
индексы для цикла/среза1:n

Диапазоны — основа индексации и построения графиков. Ось абсцисс почти всегда задают через linspace или двоеточие, а потом вычисляют функцию сразу на всём векторе.

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

Двоеточие и linspace отличаются способом подсчёта. Диапазон a:s:b может не попасть точно в b, если b-a не делится на шаг нацело; тогда последний элемент будет меньше b. А linspace гарантирует, что и первая, и последняя точки — ровно a и b. Кроме того, при дробном шаге накапливается ошибка округления double, поэтому для гладких осей графиков предпочитают именно linspace.

Колоночные и строчные диапазоны

По умолчанию двоеточие создаёт вектор-строку. Чтобы получить столбец, диапазон транспонируют: (1:5)' даёт вертикальный вектор. Это часто нужно, когда диапазон выступает осью данных, которые лежат по столбцам, или когда его предстоит склеивать с другими столбцами в матрицу. Ещё одна частая идиома — построить по диапазону сразу таблицу значений: x = (0:0.1:10)'; y = sin(x); и затем plot(x, y). Здесь диапазон, транспонирование и векторное вычисление функции складываются в три строки, которые в языке со скалярным мышлением заняли бы целый цикл. Привыкайте видеть в диапазоне не просто «счётчик», а готовую ось будущего расчёта.

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

  • Ожидать, что 0:0.1:1 даст ровно конец 1.0 — из-за округления последний элемент может «не дойти».
  • Путать порядок аргументов: в linspace третий аргумент — число точек, а не шаг.
  • Забыть, что для убывающей последовательности шаг должен быть отрицательным, иначе получится пустой вектор.

Диапазоны как сердце векторного кода

Трудно переоценить, насколько часто двоеточие встречается в реальном коде MATLAB. Им задают ось времени для сигнала, сетку точек для графика, набор индексов для цикла или среза, последовательность параметров для перебора. Фактически почти любой расчёт начинается с того, что двоеточием или linspace создаётся вектор независимой переменной, а затем функция вычисляется на нём целиком. Это прямое продолжение векторного мышления: вместо «для каждого x посчитать y» вы говорите «вот все x — посчитай все y разом».

logspace и логарифмические шкалы

У linspace есть важный родственник — logspace(a, b, n), создающий точки, равномерно распределённые в логарифмическом масштабе (от 10 в степени a до 10 в степени b). Он незаменим, когда величина меняется на много порядков: частотные характеристики фильтров, спектры, диаграммы Боде традиционно строят по логарифмической оси. Если попытаться покрыть диапазон от 1 до миллиона равномерным линейным шагом, почти все точки скучатся в верхней части; логарифмическая сетка распределяет их разумно — поровну на каждый порядок. Понимание, когда нужна линейная, а когда логарифмическая сетка, — признак зрелого инженерного подхода к данным.

Итоги

  • a:s:b — диапазон с заданным шагом; шаг по умолчанию 1, может быть отрицательным.
  • linspace(a,b,n) — ровно n точек, концы включены.
  • Для гладких осей графика берите linspace — он точен на концах.
Проверьте себя
1. Что создаёт 0:2:6?
A[0 2 6]
B[0 2 4 6]
C[2 4 6]
D[0 1 2 3 4 5 6]
2. Что задаёт третий аргумент linspace(a, b, n)?
AШаг
BЧисло точек
CНачало
DТочность
3. Почему для оси графика часто берут linspace, а не диапазон с дробным шагом?
Alinspace быстрее всегда
Blinspace точно попадает в концы a и b, без накопления ошибки
CДиапазон не работает с дробями
Dlinspace создаёт матрицу