8

我正在寻找一个优雅的解决方案来解决 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

如果我尝试检索与in 中的值M关联的元素,我会得到一个列向量1I

>> M(I)

ans =

     5
     6
     7
    13

[5 7 ; 6 13]从这个逻辑索引中获取矩阵的最简单方法是什么?

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

另外,我知道 MATLAB 中这种类型的索引的默认行为对于非零值I不形成矩阵的情况强制保持一致性,但我想知道是否有针对这种特殊情况的简单解决方案.

4

3 回答 3

11

这是一种方法。假设所有行的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')));
于 2012-07-10T18:14:47.623 回答
3

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

T = I(any(I'),any(I));
T(:) = M(I);
于 2013-03-26T15:08:01.780 回答
2
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
于 2012-07-10T18:14:38.263 回答