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 байт памяти.
Эта оптимизация, сохраняющая память, может быть отключена с помощью функции optimize_range.
- : val = optimize_range () ¶
- : old_val = optimize_range (new_val) ¶
- : optimize_range (new_val, "local") ¶
-
Запрос или установка того, используется ли специальный формат сжатия памяти для хранения диапазонов.
Значение по умолчанию — true. Если этот параметр установлен в false, Octave будет хранить диапазоны как полные матрицы.
При вызове изнутри функции с опцией
"local", настройка изменяется локально для функции и всех вызываемых ею подпрограмм. Исходная настройка восстанавливается при выходе из функции.См. также: optimize_diagonal_matrix, optimize_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/v7.2.0/Ranges.html