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]
Обратите внимание, что разрешается использовать индекс 1-D с многомерным объектом (также называемым линейным индексированием). В этом случае элементы многомерного массива берутся в порядке следования столбцов, как в Fortran. То есть, столбцы массива представляются как сложенные друг на друга, чтобы образовать столбец-вектор, а затем к этому вектору применяется единственный линейный индекс.
A(5) # linear indexing into three-dimensional array: ans = 5 A(3:5) # result has shape of index component: ans = [3, 4, 5]
Двоеточие («:») может использоваться в качестве компонента индекса для выбора всех элементов в заданном измерении. Учитывая матрицу:
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
Когда двоеточие используется в частном случае индексирования 1-D, результатом всегда является столбец-вектор. Создание столбцов-векторов с индексом двоеточие — это очень часто встречающийся фрагмент кода и он быстрее и, как правило, понятнее, чем вызов 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]
| • Расширенное индексирование: |
© 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/Index-Expressions.html