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

В 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
   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
   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

The 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 «is» также возвращают логические массивы, которые указывают, какие элементы входа отвечают определенному условию. Например, проверяйте, какие элементы массива 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
    "A"    "B"    "D"    "E"

Для получения дополнительных примеров, использующих логическое индексирование, смотрите Найти элементы массива, которые соответствуют условию.

Похожие темы