2012-07-10 125 views
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 

的逻辑变量如果我尝试检索的M关联1数值的元素在I,我得到一个列向量

>> M(I) 

ans = 

    5 
    6 
    7 
    13 

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

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

此外,我知道在MATLAB中这种类型的索引的默认行为强制执行一致性,其中I中的非零值不构成矩阵,但我想知道是否存在简单这个特殊情况的解决方案。

回答

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'))); 
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 
3

这里是一个非常简单的解决办法:

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

正是我所要回答:-) – 2015-03-17 22:36:34

+0

这不起作用永诺,例如当不对称时。 – rst 2016-04-05 09:02:05

+0

@RobertStettler如果你的意思是'I'不能随机产生,这是真的,但看看这个问题我认为这是一个合理的限制。如果你的意思是别的:我不明白symetry是如何相关的,你可能会举出一个解决方案失败的例子吗? (输入矩阵,输出,预期输出)。 – 2016-04-06 12:34:35