MATLAB:提取子矩阵与逻辑索引(MATLAB: extract submatrix with l

2019-07-30 08:38发布

我在寻找一个完美的解决方案,以在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] [5 7 ; 6 13]从该逻辑索引?

如果我知道的非零元素的形状I ,我可以使用索引后重塑,但是这不是一个一般的情况。

另外,我知道,对于这种类型的MATLAB索引的默认行为强制执行关于情况,即非零值的一致性I没有形成一个矩阵,但我不知道是否有这个特定的简单解决方案案件。

Answer 1:

这是做这样的一种方式。 假设中的所有行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')));


Answer 2:

这里是一个非常简单的解决方案:

T = I(any(I'),any(I));
T(:) = M(I);


Answer 3:

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


文章来源: MATLAB: extract submatrix with logical indexing