Индексация массива

В MATLAB® существует три первичных подхода к доступу к элементам массива на основе их местоположения (индекс) в массиве. Эти подходы индексируют положением, линейной индексацией и логической индексацией.

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

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

A = [1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16]
A = 4×4

     1     2     3     4
     5     6     7     8
     9    10    11    12
    13    14    15    16

e = A(3,2)
e = 10

e является элементом в 3,2 положениях (третья строка, второй столбец) A.

Можно также сослаться на несколько элементов за один раз путем определения их индексов в векторе. Например, получите доступ к первым и третьим элементам второй строки A.

r = A(2,[1 3])
r = 1×2

     5     7

К элементам доступа в области значений строк или столбцов, используйте colon. Например, получите доступ к элементам в первом через третью строку и втором через четвертый столбец A.

r = A(1:3,2:4)
r = 3×3

     2     3     4
     6     7     8
    10    11    12

Альтернативный способ вычислить r состоит в том, чтобы использовать ключевое слово end, чтобы задать второй столбец через последний столбец. Этот подход позволяет вам задать последний столбец, не зная точно, сколько столбцов находится в A.

r = A(1:3,2:end)
r = 3×3

     2     3     4
     6     7     8
    10    11    12

Если вы хотите получить доступ ко всем строкам или столбцам, используйте оператор двоеточия отдельно. Например, возвратите целый третий столбец A.

r = A(:,3)
r = 4×1

     3
     7
    11
    15

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

t = [datetime(2018,1:5,1); datetime(2019,1:5,1)]
t = 2x5 datetime array
   01-Jan-2018   01-Feb-2018   01-Mar-2018   01-Apr-2018   01-May-2018
   01-Jan-2019   01-Feb-2019   01-Mar-2019   01-Apr-2019   01-May-2019

march1 = t(:,3)
march1 = 2x1 datetime array
   01-Mar-2018
   01-Mar-2019

Для более многомерных массивов расширьте синтаксис, чтобы совпадать с измерениями массива. Рассмотрите случайные 3 3х3 числовым массивом. Доступ к элементу во второй строке, третьем столбце и первом листе массива.

A = rand(3,3,3);
e = A(2,3,1)
e = 0.5469

Для получения дополнительной информации о работе с многомерными массивами смотрите Многомерные массивы.

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

Другой метод для доступа к элементам массива должен использовать только один индекс, независимо от размера или размерностей массива. Этот метод известен как линейную индексацию. В то время как MATLAB отображает массивы согласно их заданным размерам и формам, они на самом деле хранятся в памяти как отдельный столбец элементов. Хороший способ визуализировать эту концепцию с матрицей. В то время как следующий массив отображен как 3х3 матрица, MATLAB хранит его как отдельный столбец, составленный из столбцов A, добавленного один за другим. Сохраненный вектор содержит последовательность элементов 12, 45, 33, 36, 29, 25, 91, 48, 11, и может быть отображен с помощью одного двоеточия.

A = [12 36 91; 45 29 48; 33 25 11]
A = 3×3

    12    36    91
    45    29    48
    33    25    11

Alinear = A(:)
Alinear = 9×1

    12
    45
    33
    36
    29
    25
    91
    48
    11

Например, 3,2 элементами A является 25, и можно получить доступ к нему с помощью синтаксиса A(3,2). Можно также получить доступ к этому элементу с помощью синтаксиса A(6), поскольку 25 является шестым элементом сохраненной векторной последовательности.

e = A(3,2)
e = 25
elinear = A(6)
elinear = 25

В то время как линейная индексация может быть менее интуитивной визуально, это может быть мощно для выполнения определенных вычислений, которые не зависят от размера или формы массива. Например, можно легко суммировать все элементы A, не имея необходимость предоставлять второй аргумент функции sum.

s = sum(A(:))
s = 330

sub2ind и функции ind2sub помогают преобразовать между индексами исходного массива и их линейной версией. Например, вычислите линейный индекс 3,2 элементов A.

linearidx = sub2ind(size(A),3,2)
linearidx = 6

Преобразуйте от линейного индекса назад к его форме строки и столбца.

[row,col] = ind2sub(size(A),6)
row = 3
col = 2

Индексация с логическими значениями

Используя истинные и ложные логические индикаторы другой полезный способ индексировать в массивы, особенно при работе с условными операторами. Например, скажите, что вы хотите знать, являются ли элементы матричного A меньше, чем соответствующие элементы другого матричного B. Меньше оператор возвращает логический массив, элементами которого является 1, когда элемент в A меньше, чем соответствующий элемент в B.

A = [1 2 6; 4 3 6]
A = 2×3

     1     2     6
     4     3     6

B = [0 3 7; 3 7 5]
B = 2×3

     0     3     7
     3     7     5

ind = A<B
ind = 2x3 logical array

   0   1   1
   0   1   0

Теперь, когда вы знаете местоположения элементов, удовлетворяющих условию, можно осмотреть отдельные значения с помощью ind в качестве индексного массива. MATLAB совпадает с местоположениями значения 1 в ind к соответствующим элементам A и B, и перечисляет их значения в вектор-столбце.

Avals = A(ind)
Avals = 3×1

     2
     3
     6

Bvals = B(ind)
Bvals = 3×1

     3
     7
     7

MATLAB "является" функциями, также возвращают логические массивы, которые указывают, какие элементы входа соблюдают определенное условие. Например, проверяйте, какие элементы вектора string избегают использовать функцию ismissing.

str = ["A" "B" missing "D" "E" missing];
ind = ismissing(str)
ind = 1x6 logical array

   0   0   1   0   0   1

Предположим, что вы хотите найти значения элементов, которые не отсутствуют. Используйте оператор ~ с индексным вектором ind, чтобы сделать это.

strvals = str(~ind)
strvals = 1x4 string array
    "A"    "B"    "D"    "E"

Для большего количества примеров, использующих логическую индексацию, смотрите, Находят Элементы массива, Которые Удовлетворяют Условию.

Похожие темы