Ответ 1
TL;DR: короткий ответ
Что касается вашего вопроса, предположим, что у вас есть произвольная матрица размером 10 на 10 A
. Самый простой способ извлечь нужную подматрицу будет с индексом:
B = A([1 2 9], [4 6]);
Индексирование в MATLAB
В официальной документации есть интересная статья, которая всесторонне объясняет индексацию в MATLAB. В принципе, есть несколько способов извлечь подмножество значений, я подведу их для вас:
1. Индексирующие векторы
Индексирующие векторы указывают индексы подлежащего извлечению элемента. Они могут содержать либо один индекс, либо несколько, например:
A = [10 20 30 40 50 60 70 80 90]
%# Extracts the third and the ninth element
B = A([3 9]) %# B = [30 90]
Индексирующие векторы могут быть указаны для каждого измерения отдельно, например:
A = [10 20 30; 40 50 60; 70 80 90];
%# Extract the first and third rows, and the first and second columns
B = A([1 3], [1 2]) %# B = [10 30; 40 60]
Есть также два специальных индекса: end
и двоеточие (:
):
-
end
просто указывает последний индекс в этом измерении. - Двоеточие - это всего лишь короткая нотация для "1: конец".
Например, вместо записи A([1 2 3], [2 3])
вы можете написать A(:, 2:end)
. Это особенно полезно для больших матриц.
2. Линейное индексирование
Линейное индексирование обрабатывает любую матрицу, как если бы она была вектором столбца, объединяя столбцы в один вектор столбца и присваивая индексы элементам соответственно. Например, мы имеем:
A = [10 20 30; 40 50 60; 70 80 90];
и мы хотим вычислить b = A(2)
. Эквивалентный вектор столбца:
A = [10;
40;
70;
20;
50;
80;
30;
60;
90]
и, следовательно, b
равно 40.
Конечно, также разрешены специальные индексы двоеточия и end
. По этой причине A(:)
преобразует любую матрицу A
в вектор-столбец.
Линейная индексация с матричными индексами:
Также возможно использовать другую матрицу для линейной индексации. Матрица индексов просто преобразуется в вектор столбца и используется для линейной индексации. Полученная матрица, однако, всегда имеет те же размеры, что и матрица индексов.
Например, если I = [1 3; 1 2]
, то A(I)
совпадает с записью reshape(A(I(:)), size(I))
.
Преобразование из матричных индексов в линейные индексы и наоборот:
Для этого у вас sub2ind
и ind2sub
, соответственно. Например, если вы хотите преобразовать индексы [1, 3]
в матрице A
(соответствующие элементу 30) в линейный индекс, вы можете написать sub2ind(size(A), 1, 3)
(результат в этом случае должен быть 7, конечно).
3. Логическая индексация
В логической индексации индексы двоичные, где логический 1
указывает, что выбран соответствующий элемент, а 0
означает, что это не так. Вектор индекса должен быть либо одного и того же размера, как исходная матрица или вектор с таким же количеством элементов. Например, если мы имеем:
A = [10 20 30; 40 50 60; 70 80 90];
и мы хотим извлечь A([1 3], [1 2])
с помощью логической индексации, мы можем сделать следующее:
Ir = logical([1 1 0]);
Ic = logical([1 0 1]);
B = A(Ir, Ic)
или это:
I = logical([1 0 1; 1 0 1; 0 0 0]);
B = A(I)
или это:
I = logical([1 1 0 0 0 0 1 1 0]);
B = A(I)
Заметим, что в последних двух случаях это одномерный вектор, и при необходимости его необходимо преобразовать обратно в матрицу (например, используя reshape
).