Как выбрать подматрицу (не в любом шаблоне) в Matlab? Например, для матрицы размером 10 на 10, как выбрать подматрицу, состоящую из пересечения 1-й 2-й и 9-й строк и 4-го и 6-го столбцов?
Спасибо за полезные ответы!
Как выбрать подматрицу (не в любом шаблоне) в Matlab? Например, для матрицы размером 10 на 10, как выбрать подматрицу, состоящую из пересечения 1-й 2-й и 9-й строк и 4-го и 6-го столбцов?
Спасибо за полезные ответы!
Что касается вашего вопроса, предположим, что у вас есть произвольная матрица размером 10 на 10 A
. Самый простой способ извлечь нужную подматрицу будет с индексом:
B = A([1 2 9], [4 6]);
В официальной документации есть интересная статья, которая всесторонне объясняет индексацию в MATLAB. В принципе, есть несколько способов извлечь подмножество значений, я подведу их для вас:
Индексирующие векторы указывают индексы подлежащего извлечению элемента. Они могут содержать либо один индекс, либо несколько, например:
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
просто указывает последний индекс в этом измерении.Например, вместо записи A([1 2 3], [2 3])
вы можете написать A(:, 2:end)
. Это особенно полезно для больших матриц.
Линейное индексирование обрабатывает любую матрицу, как если бы она была вектором столбца, объединяя столбцы в один вектор столбца и присваивая индексы элементам соответственно. Например, мы имеем:
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, конечно).
В логической индексации индексы двоичные, где логический 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
).
Позвольте мне объяснить с помощью примера:
Определим матрицу 6x6
A = magic(6)
A =
35 1 6 26 19 24
3 32 7 21 23 25
31 9 2 22 27 20
8 28 33 17 10 15
30 5 34 12 14 16
4 36 29 13 18 11
Из этой матрицы вам нужны элементы в строках 1, 2 и 5, а в столбцах 4 и 6
B = A([1 2 5],[4 6])
B =
26 24
21 25
12 16
Надеюсь, что это поможет.
function f = sub(A,i,j)
[m,n] = size(A);
row = 1:m;
col = 1:n;
x = row;
x(i) = [];
y=col;
y(j) = [];
f= A(x,y);
Возвращает матрицу A с удаленной i-й строкой и j-м столбцом.