MATLAB: извлечь подматрицу с логическим индексированием
Я ищу элегантное решение этой очень простой проблемы в MATLAB. Предположим, у меня есть матрица
>> M = magic(5)
M =
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
и логическая переменная вида
I =
0 0 0 0 0
0 1 1 0 0
0 1 1 0 0
0 0 0 0 0
0 0 0 0 0
Если я попытаюсь извлечь элементы M
связано с 1
значения в I
Я получаю вектор столбца
>> M(I)
ans =
5
6
7
13
Какой был бы самый простой способ получить матрицу [5 7 ; 6 13]
из этой логической индексации?
Если я знаю форму ненулевых элементов I
Я могу использовать изменение формы после индексации, но это не общий случай.
Кроме того, я знаю, что поведение по умолчанию для этого типа индексации в MATLAB обеспечивает согласованность по отношению к случаю, когда ненулевые значения в I
не формировать матрицу, но мне интересно, есть ли простое решение для этого конкретного случая.
3 ответа
Это один из способов сделать это. Предполагается, что все ряды I
иметь такое же количество единиц. Также предполагается, что все столбцы I
имеют одинаковое количество есть, потому что Submatrix
должен быть прямоугольным.
%# Define the example data.
M = magic(5);
I = zeros(5);
I(2:3, 2:3) = 1;
%# Create the Submatrix.
Submatrix = reshape(M(find(I)), max(sum(I)), max(sum(I')));
Вот очень простое решение:
T = I(any(I'),any(I));
T(:) = M(I);
M = magic(5);
I = [ ... ];
ind = find(I); %# find indices of ones in I
[y1, x1] = ind2sub(size(M), ind(1)); %# get top-left position
[y2, x2] = ind2sub(size(M), ind(end)); %# get bottom-right position
O = M(y1:y2, x1:x2); %# copy submatrix