【问题标题】:How to get all submatrixes(2x2) from any square matrix using function and then make a new matrix with maximum values from the submatrixes如何使用函数从任何方阵中获取所有子矩阵(2x2),然后从子矩阵中创建一个具有最大值的新矩阵
【发布时间】:2020-12-10 20:04:08
【问题描述】:

例如,我有这个矩阵(3x3),我想用所有子矩阵的最大值创建一个新的 2x2 矩阵:

 ???? = [
     5 4 6
     3 2 3
     8 8 9

第一个子矩阵:

[5 4
 3 2 ]
 max value=5

第二个子矩阵:

[4 6
 2 3]
     max value=6

第三个子矩阵:

[3 2
 8 8 ]
     max value=8

第四个子矩阵:

[2 3
8 9]
max value=9

我想得到这个矩阵(2x2),它的所有最大值都是前面子矩阵的元素:

 NewA=[5 6
       8 9]

你唯一可以使用的最后一件事是基本的东西,比如 for 循环 if 语句....(简单的解决方案,初学者的解决方案) 另外你不能使用 max 函数,你必须为此编写代码,并且解决方案应该适用于每个方阵

【问题讨论】:

  • 你有图像处理工具箱吗?
  • 不,我没有。我不允许使用任何太高级的东西。我需要一个初学者的解决方案
  • 为什么从一开始就没有那么重要的信息?无论如何,这看起来像家庭作业,所以你应该自己尝试一下,问你是否卡住了
  • 你是对的。谢谢你的努力

标签: matlab matrix octave submatrix


【解决方案1】:

使用图像处理工具箱

A = [5 4 6; 3 2 3; 8 8 9];
block_size = [2 2];
NewA = reshape(max(im2col(A, block_size, 'sliding'), [], 1), size(A)-block_size+1);

它是如何工作的:

  1. im2col(A, block_size, 'sliding') 将每个大小为block_size 的滑动子矩阵排列为一列;
  2. max(..., [], 1) 取每一列的最大值;
  3. reshape(..., size(A)-block_size+1) 将结果重新整形为适当大小的矩阵。

请注意,第 1 步和第 3 步都使用column-major order,因此结果中的最大值与输入数据的排列一致。

没有工具箱

使用linear indexingimplicit expansionim2col的行为可以模拟如下:

A = [5 4 6; 3 2 3; 8 8 9];
block_size = [2 2];
ind_base = (1:block_size(1)).' + (0:block_size(2)-1)*size(A,1);
ind_corner = (1:size(A,1)-block_size(1)+1).'+ (0:size(A,2)-block_size(2))*size(A,2);
ind_cols = ind_base(:) + ind_corner(:).' - 1;
NewA = reshape(max(A(ind_cols), [], 1) , size(A)-block_size+1);

ind_baseind_cornerind_cols这三个变量有以下解释:

  • ind_base 定义第一个(最上面,最左边)子矩阵的线性索引;
  • ind_corner 定义了每个子矩阵左上角的线性索引;
  • ind_cols 包含按列排列的每个子矩阵的线性索引。

【讨论】:

    【解决方案2】:

    由于子矩阵是2x2,您可以手动计算最大值:

    B = max(max(max(A(1:end-1, 1:end-1), A(1:end-1, 2:end)), A(2:end, 1:end-1)), A(2:end, 2:end));
    

    B = max(cat(3, A(1:end-1, 1:end-1), A(1:end-1, 2:end), A(2:end, 1:end-1), A(2:end, 2:end)), [], 3);
    

    如果A 是方阵,则两种方法都可以更紧凑地写成:

    n = size(A, 1);
    x = 1:n-1;
    y = 2:n;
    B = max(max(max(A(x,x), A(x,y)), A(y,x)), A(y,y));
    B = max(cat(3, A(x,x), A(x,y), A(y,x), A(y,y)), [], 3);
    

    【讨论】:

      【解决方案3】:

      使用 For-Loops(滑窗法)

      使用一组嵌套的 for 循环来获取 4 个邻域(2 x 2)。它相对于变量Row_IndexColumn_Index 的邻域位置,这些变量在for循环中递增/索引。

      A = [5 4 6;
           3 2 3;
           8 8 9]; 
       
      [Number_Of_Rows,Number_Of_Columns] = size(A);
      Result = zeros(Number_Of_Rows-1,Number_Of_Columns-1);
      
      for Row_Index = 1: Number_Of_Rows - 1
         for Column_Index = 1: Number_Of_Columns - 1
      
          Window = A(Row_Index:Row_Index+1,Column_Index:Column_Index+1);
             
          Maximum = Window(1);
          for Index = 2: 4
          if Window(Index) > Maximum
          Maximum = Window(Index); 
          end
          end
                  
          Result(Row_Index,Column_Index) = Maximum;
         end
      end
      
      Result
      

      使用 MATLAB R2019b 运行

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-14
        相关资源
        最近更新 更多