4.2 Диапазоны
Диапазон — удобный способ записи строчного вектора с равномерно распределёнными элементами. Выражение диапазона определяется значением первого элемента в диапазоне, необязательным значением приращения между элементами и максимальным значением, которое элементы диапазона не превысят. База, приращение и предел разделяются двоеточиями (символом «:») и могут содержать любые арифметические выражения и вызовы функций. Если приращение опущено, оно предполагается равным 1. Например, диапазон
1 : 5
определяет множество значений [ 1, 2, 3, 4, 5 ], а диапазон
1 : 3 : 5
определяет множество значений [ 1, 4 ].
Хотя константа диапазона задаёт строчный вектор, Octave обычно не преобразует константы диапазонов в векторы, если это не необходимо. Это позволяет вам записать константу, например, 1 : 10000, не используя 80 000 байт памяти на типичной 32-битной рабочей станции.
Частым случаем, когда преобразование диапазонов в векторы становится необходимым, является их появление внутри вектора (т. е. внутри квадратных скобок). Например, в то время как
x = 0 : 0.1 : 1;
определяет x как переменную типа range и занимает 24 байта памяти, выражение
y = [ 0 : 0.1 : 1];
определяет y как переменную типа matrix и занимает 88 байт памяти.
Эту оптимизацию по экономии места можно отключить, используя функцию disable_range.
- : val = disable_range ()
- : old_val = disable_range (new_val)
- : disable_range (new_val, "local")
-
Запрос или установка значения флага, отключающего хранение диапазонов в специальном формате, экономящем место.
Значение по умолчанию — ложь. Если этот параметр установлен в значение «истина», Octave будет хранить диапазоны в виде полных матриц.
При вызове изнутри функции с опцией
"local"значение изменяется локально для функции и любых вызываемых ею подпрограмм. Исходное значение восстанавливается при выходе из функции.См. также: disable_diagonal_matrix, disable_permutation_matrix.
Обратите внимание, что верхняя (или нижняя, если приращение отрицательно) граница диапазона не всегда включается в множество значений, и диапазоны, определённые с помощью чисел с плавающей точкой, могут давать неожиданные результаты, поскольку Octave использует арифметику чисел с плавающей точкой для вычисления значений в диапазоне. Если важно включать конечные точки диапазона и известно количество элементов, следует использовать функцию linspace вместо неё (см. Специальные матрицы-утилиты).
При добавлении скалярного значения к диапазону, вычитании скалярного значения из него (или вычитании диапазона из скалярного значения) и умножении на скаляр, Octave попытается избежать распаковки диапазона и сохранить результат как диапазон, если сможет определить, что это безопасно. Например, выполнение
a = 2*(1:1e7) - 1;
даст тот же результат, что и 1:2:2e7-1, но без создания вектора из десяти миллионов элементов.
Использование нуля в качестве приращения в записи с двоеточием, например, 1:0:1, недопустимо, так как произойдёт деление на ноль при определении количества элементов диапазона. Однако диапазоны с нулевым приращением (т. е. со всеми равными элементами) полезны, особенно в индексировании, и Octave позволяет их создавать, используя встроенную функцию ones. Обратите внимание, что, поскольку диапазон должен быть строчным вектором, ones (1, 10) создаёт диапазон, а ones (10, 1) — нет.
При разборе Octave выражения диапазона проверяет, являются ли все его элементы константами. Если да, то оно заменяет выражение диапазона единственной константой диапазона.
© 1996–2022 The Octave Project Developers
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions.
https://docs.octave.org/v6.4.0/Ranges.html