8.1 Выражения индексов
Выражение индекса позволяет вам ссылаться или извлекать выбранные элементы вектора, матрицы (2-мерного массива) или многомерного массива.
Индексы могут быть скалярами, векторами, диапазонами или специальным оператором «:», который выбирает целые строки, столбцы или многомерные срезы.
Выражение индекса состоит из набора скобок, содержащих M выражений, разделенных запятыми. Каждое отдельное значение индекса или компонент используется для соответствующего измерения объекта, к которому оно применяется. Другими словами, первый компонент индекса используется для первого измерения (строки) объекта, второй компонент индекса используется для второго измерения (столбцы) объекта и так далее. Количество компонентов индекса M определяет размерность выражения индекса. Индекс с двумя компонентами будет называться 2-мерным индексом, потому что он имеет две размерности.
В самом простом случае: 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]
Обратите внимание, что разрешается использовать одномерный индекс с многомерным объектом (также называемый линейным индексированием). В этом случае элементы многомерного массива берутся в порядке следования столбцов, как в 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–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/Index-Expressions.html