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")
Запрос или установка внутренней переменной, которая управляет тем, хранятся ли диапазоны в специальном компактном формате.
Значение по умолчанию — true. Если этот параметр отключён, 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/v5.2.0/Ranges.html