【问题标题】:How to create Sub matrix(all 5*5) from a Matrix in MATLAB?如何从 MATLAB 中的矩阵创建子矩阵(全部 5*5)?
【发布时间】:2019-01-23 14:42:26
【问题描述】:

如何从 MATLAB 中的矩阵创建子矩阵(全部 5*5)?这可以通过恰好移动一行和一列来完成。我尝试使用以下代码,但没有得到实际输出。这里 A 是输入矩阵。

A=[40 45 50 60 70 80; 
    10 12 15 17 18 20; 
    35 41 57 44 98 78;
    45 74 11 2 36 78;
    12 45 79 85 36 45; 
    1 5 8 78 47 3]

for i=1:size(A,1)-4   
       for j=1:size(A,2)-4      
          B{i,j}=A(i:i+4,j:j+4)        
       end 
     end

现在我得到了这个输出:

A =

   40   45   50   60   70   80
   10   12   15   17   18   20
   35   41   57   44   98   78
   45   74   11    2   36   78
   12   45   79   85   36   45
    1    5    8   78   47    3

B = 
{
  [1,1] =

     40   45   50   60   70
     10   12   15   17   18
     35   41   57   44   98
     45   74   11    2   36
     12   45   79   85   36

}
B = 
{
  [1,1] =

     40   45   50   60   70
     10   12   15   17   18
     35   41   57   44   98
     45   74   11    2   36
     12   45   79   85   36

  [1,2] =

     45   50   60   70   80
     12   15   17   18   20
     41   57   44   98   78
     74   11    2   36   78
     45   79   85   36   45

}
B = 
{
  [1,1] =

     40   45   50   60   70
     10   12   15   17   18
     35   41   57   44   98
     45   74   11    2   36
     12   45   79   85   36

  [2,1] =

     10   12   15   17   18
     35   41   57   44   98
     45   74   11    2   36
     12   45   79   85   36
      1    5    8   78   47

  [1,2] =

     45   50   60   70   80
     12   15   17   18   20
     41   57   44   98   78
     74   11    2   36   78
     45   79   85   36   45

  [2,2] = [](0x0)
}
B = 
{
  [1,1] =

     40   45   50   60   70
     10   12   15   17   18
     35   41   57   44   98
     45   74   11    2   36
     12   45   79   85   36

  [2,1] =

     10   12   15   17   18
     35   41   57   44   98
     45   74   11    2   36
     12   45   79   85   36
      1    5    8   78   47

  [1,2] =

     45   50   60   70   80
     12   15   17   18   20
     41   57   44   98   78
     74   11    2   36   78
     45   79   85   36   45

  [2,2] =

     12   15   17   18   20
     41   57   44   98   78
     74   11    2   36   78
     45   79   85   36   45
      5    8   78   47    3

}

但我需要这样的输出:

40   45   50   60   70
10   12   15   17   18
35   41   57   44   98
45   74   11    2   36
12   45   79   85   36


45   50   60   70   80
12   15   17   18   20
41   57   44   98   78
74   11    2   36   78
45   79   85   36   45

10   12   15   17   18
35   41   57   44   98
45   74   11    2   36
12   45   79   85   36
1    5    8   78   47


12   15   17   18   20
41   57   44   98   78
74   11    2   36   78
45   79   85   36   45
5    8   78   47    3

我必须在我的代码中更改什么?

【问题讨论】:

    标签: matlab matrix matlab-compiler


    【解决方案1】:

    重复显示是由于在B 中保存子矩阵的行中缺少分号。 您期望的输出需要此索引:

    B{j,i} = A(i:i+4, j:j+4);
    

    然后您可以使用celldisp(B) 来显示单元格。

    请在循环前用B=cell(2, 2);预先分配单元数组

    【讨论】:

      【解决方案2】:

      您已经创建了一个矩阵元胞数组,因此B 会按原样显示。

      尝试这样做:

      A=[40 45 50 60 70 80; 
         10 12 15 17 18 20; 
         35 41 57 44 98 78;
         45 74 11 2 36 78;
         12 45 79 85 36 45; 
         1 5 8 78 47 3];
      
      for i=1:size(A,1)-4   
         for j=1:size(A,2)-4      
            B = A(i:i+4,j:j+4);
            disp(B)        
         end 
       end
      

      根据您要对每个子矩阵执行的操作,接下来要执行的操作会有所不同。您可以采取的一种方法是将子矩阵保存在具有相关名称的 .mat 文件中,例如:

      save(['B_',num2str(i),'_',num2str(j),'.mat'],'B')
      

      (在我的示例中将这一行放在调用 disp 的位置。)

      【讨论】:

      • 这是我遇到的错误。使用保存时出错 无法写入文件 B_1_1.mat:权限被拒绝。 newtesting 出错(第 9 行) save(['B_',num2str(i),'',num2str(j),'.mat'],'B') newtesting 使用 save 时出错 无法写入文件 B_1_1。垫子:权限被拒绝。 newtesting 出错(第 9 行) save(['B',num2str(i),'_',num2str(j),'.mat'],'B')
      • 奇数。您是否正在处理具有写入权限的文件夹?尝试使用不同的名称(例如 C_1_1.mat)保存在不同的位置。同时,B 矩阵是否如您所愿出现在控制台上?
      • 是的,B 矩阵出现在控制台中。但是那个错误是存在的。另一件事是我如何使用所有这些 5*5 矩阵?因为我必须使用公式更新所有矩阵值。然后所有更新的 5*5 矩阵应该保存在另一个变量中。
      • 作为一个快速修复,我想到了可怕的 eval 函数。 eval('B_',num2str(i),'_',num2str(j),'= B;') 应该将 B 的每个值归因于名为 B_1_1 的变量,依此类推。然后你就可以把它们都放在你的工作区了。
      • @ArijitPanigrahi :我刚刚尝试重现您的错误,但我没有想到。错误是否已为您解决?你必须做任何修复吗?
      猜你喜欢
      • 2012-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-10
      • 1970-01-01
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      相关资源
      最近更新 更多