В 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"
Дополнительные примеры использования логической индексации см. в разделе Поиск элементов массива, удовлетворяющих условию.