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
Другие вопросы по тегам