exponenta event banner

Индексирование массива

В 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

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"

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

Связанные темы