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
Когда двоеточие используется в особом случае индексирования 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]
Дополнительную информацию см. в "end" keyword.
Линейный индексирование ¶
Допустимо использовать индекс 1-D с многомерным объектом. Это также называется линейным индексированием. В этом случае элементы многомерного массива берутся в порядке следования столбцов, как в 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) Ложные элементы логического индекса вне размера массива игнорируются, но когда девятый элемент логического индекса равен true, он вызывает ошибку, так как пытается выбрать несуществующий девятый элемент массива.
© 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/v9.2.0/Index-Expressions.html