Spec-Zone.ru › Octave 9

8.1 Индексные выражения

Индексное выражение позволяет ссылаться на выбранные элементы вектора, матрицы (2-D) или массива большей размерности либо извлекать их. Массивы можно индексировать тремя способами: индексация по компонентам, линейная индексация и логическая индексация.

Индексация по компонентам

Индексы компонентов могут быть скалярами, векторами, диапазонами или специальным оператором «:», который выбирает целые строки, столбцы или срезы большей размерности.

Индексное выражение по компонентам состоит из набора выражений, заключённых в круглые скобки и разделённых запятыми; всего таких выражений M. Каждое отдельное значение индекса, или компонент, используется для соответствующей размерности объекта, к которому он применяется. Другими словами, первый компонент индекса используется для первой размерности объекта (строк), второй компонент индекса — для второй размерности объекта (столбцов) и так далее. Количество компонентов индекса M определяет размерность индексного выражения. Индекс с двумя компонентами называется 2-D индексом, поскольку он имеет две размерности.

В простейшем случае: 1) все компоненты являются скалярами и 2) размерность индексного выражения M равна размерности объекта, к которому оно применяется. Например:

A = reshape (1:8, 2, 2, 2)  # Create 3-D array
A =

ans(:,:,1) =

   1   3
   2   4

ans(:,:,2) =

   5   7
   6   8

A(2, 1, 2)   # second row, first column of second slice
             # in third dimension: ans = 6

Размер возвращаемого объекта в конкретной размерности равен количеству элементов в соответствующем компоненте индексного выражения. Если все компоненты являются скалярами, результатом будет одно выходное значение. Однако если какой-либо компонент является вектором или диапазоном, возвращаемые значения представляют собой декартово произведение индексов в соответствующих размерностях. Например:

A([1, 2], 1, 2) ≡ [A(1,1,2); A(2,1,2)]
⇒
ans =
   5
   6

Общее количество возвращаемых значений равно произведению количества элементов, возвращаемых для каждого компонента индекса. В приведённом выше примере общее количество составляет 2*1*1 = 2 элемента.

Обратите внимание: размер возвращаемого объекта в заданной размерности равен количеству элементов индексного выражения для этой размерности. В приведённом выше коде первый компонент индекса ([1, 2]) был задан как вектор-строка, однако его форма не имеет значения. Важно то, что компонент задавал два значения, поэтому размер результата в первой размерности должен быть равен двум; а поскольку первой размерности соответствуют строки, результат в целом является вектором-столбцом.

A(1, [2, 1, 1], 1)    # result is a row vector: ans = [3, 1, 1]
A(ones (2, 2), 1, 1)  # result is a column vector: ans = [1; 1; 1; 1]

Первая строка ещё раз показывает, что размер выходных данных в заданной размерности равен количеству элементов в соответствующем компоненте индексации. В этом случае выходные данные содержат три элемента во второй размерности (соответствующей столбцам), поэтому результатом является вектор-строка. Пример также показывает, как повторяющиеся элементы в индексном выражении можно использовать для дублирования элементов в выходных данных. Последний пример дополнительно подтверждает, что форма компонента индексации не имеет значения: важно только количество элементов (2x2 = 4).

Приведённые выше правила применяются, если размерность индексного выражения больше единицы (M > 1). Однако для одномерных индексных выражений действуют особые правила, и форма выходных данных определяется формой компонента индексации. Например:

A([1, 2])  # result is a row vector: ans = [1, 2]
A([1; 2])  # result is a column vector: ans = [1; 2]

Правила определения формы для A(P):

  • Если хотя бы одна из переменных A или P имеет две или более размерности, то A(P) принимает форму P. Это происходит, когда хотя бы одна из переменных является матрицей 2-D или массивом N-D.
  • Если и A, и P являются одномерными векторами, то A(P) принимает форму самой A. В частности, если A — вектор-строка, то A(P) также является вектором-строкой независимо от формы P. Аналогичное правило действует, когда A — вектор-столбец.

В качестве компонента индекса можно использовать двоеточие («:»), чтобы выбрать все элементы в заданной размерности. Для матрицы

A = [1, 2; 3, 4]

все следующие выражения эквивалентны и выбирают первую строку матрицы.

A(1, [1, 2])  # row 1, columns 1 and 2
A(1, 1:2)     # row 1, columns in range 1-2
A(1, :)       # row 1, all columns

Если двоеточие используется в особом случае одномерной индексации, результатом всегда является вектор-столбец. Создание векторов-столбцов с помощью индекса-двоеточия — очень распространённый приём в коде; для этого случая он работает быстрее и, как правило, понятнее, чем вызов reshape.

A(:)    # result is column vector: ans = [1; 2; 3; 4]
A(:)'   # result is row vector: ans = [1, 2, 3, 4]

В индексных выражениях ключевое слово end автоматически обозначает последний элемент в заданной размерности. Этот специальный индекс можно также использовать в диапазонах; зачастую он позволяет не вызывать size или length для получения границ массива перед индексацией. Например:

A(1:end/2)        # first half of A => [1, 2]
A(end + 1) = 5;   # append element
A(end) = [];      # delete element
A(1:2:end)        # odd elements of A => [1, 3]
A(2:2:end)        # even elements of A => [2, 4]
A(end:-1:1)       # reversal of A => [4, 3, 2, 1]

Дополнительную информацию см. в разделе "end" keyword.

Линейная индексация

Допускается использовать одномерный индекс с многомерным объектом. Такой способ также называется линейной индексацией. В этом случае элементы многомерного массива рассматриваются в порядке «сначала столбцы», как в Fortran. Иными словами, предполагается, что столбцы массива уложены друг над другом, образуя вектор-столбец, после чего к этому вектору применяется единственный линейный индекс.

A = [1, 2, 3; 4, 5, 6; 7, 8, 9];

A(4)    # linear index of 4th element in 2-D array: ans = 2
A(3:5)  # result has shape of index component: ans = [7, 2, 5]
A([1, 2, 2, 1]) # result includes repeated elements: ans = [1, 4, 4, 1]

Логическая индексация

Для индексации матриц и массивов ячеек также можно использовать логические значения. При индексации логическим массивом результатом будет вектор, содержащий значения, соответствующие true частям логического массива. Это показано в следующих примерах.

data = [ 1, 2; 3, 4 ];
idx = [true, false; false true];
data(idx)
     ⇒ ans = [ 1; 4 ]

idx = (data <= 2);
data(idx)
     ⇒ ans = [ 1; 2 ]

Вместо создания массива idx в приведённом выше коде можно заменить data(idx) на data( data <= 2 ).

Хотя размер логических индексных выражений обычно совпадает с размером индексируемого массива, это не является обязательным условием. Если размер логического индекса отличается от размера массива, элементы массива сопоставляются с элементами логического индекса в соответствии с их линейным порядком, как и при линейной индексации.

data = [ 1, 2, 3; 4, 5, 6 ];
idx = [ true, false, false, true ];
data(idx)
     ⇒ ans = [ 1 5 ]  # idx selected the 1st and 4th position elements

Если логический индекс больше массива, возникнет ошибка выхода за границы, если какие-либо значения true попытаются выбрать линейную позицию, превышающую количество элементов в массиве.

idx = [ true, true, false; false, true, false; true; false; false ];
data(idx)
     ⇒ ans = [ 1; 2; 5; 3 ] # returns positions 1, 3, 4, 5 in a column

idx = [ true, true, false; false, true, false; true; false; true ];
data(idx)
     ⇒ error: a(9): out of bound 6 (dimensions are 2x3)

Элементы false логического индекса, находящиеся за пределами размера массива, игнорируются. Однако если девятый элемент логического индекса имеет значение true, возникает ошибка, поскольку он пытается выбрать несуществующий девятый элемент массива.

  • Расширенная индексация

© 1996–2026 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/v9.4.0/Index-Expressions.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API