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 является столбцом.
Обратите внимание, что допустимо использовать одномерный индекс с многомерным объектом (также называемый линейной индексацией). В этом случае элементы многомерного массива берутся в порядке следования столбцов, как в 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
Когда двоеточие используется в особом случае одномерной индексации, результатом всегда является столбец. Создание столбцов с помощью индекса двоеточия является очень часто используемым в коде приемом и быстрее, и, как правило, яснее, чем вызов 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–2023 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/v8.1.0/Index-Expressions.html