【问题标题】:MATLAB: extract submatrix with logical indexingMATLAB:使用逻辑索引提取子矩阵
【发布时间】:2012-07-10 06:40:30
【问题描述】:

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

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

>> M(I)

ans =

     5
     6
     7
    13

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

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

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

【问题讨论】:

    标签: matlab matrix indexing addressing submatrix


    【解决方案1】:

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

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

    【讨论】:

    • 正是我要回答的:-)
    • 这并不总是有效的,例如不对称时。
    • @RobertStettler 如果您的意思是矩阵 I 不能随机生成,那是真的,但看看这个问题,我认为这是一个合理的限制。如果你的意思是别的:我看不出这里的对称性有多重要,你能否举一个解决方案失败的例子? (输入矩阵、输出、预期输出)。
    • 好吧,我的评论不够精确:如果选择矩阵I 不对称,T 的形式会出现一些问题。事实上,我相信你可以通过简单地将第一行更改为:T = I(any(I'), any(I)); 来纠正答案。使用此示例输入矩阵尝试您的解决方案:I = zeros(5);I(1:4, 2:3) = 1;
    • @YonggooNoh 很高兴看到热情,但请注意网站的一般政策:如果您认为帖子不错,请投票。喋喋不休的 cmets 使未来的读者更难从线程中提取相关信息。
    【解决方案2】:

    这是一种方法。假设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')));
    

    【讨论】:

      【解决方案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
      

      【讨论】:

        猜你喜欢
        • 2023-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-28
        • 2013-07-20
        相关资源
        最近更新 更多