Как создать подматрицу (все 5 * 5) из матрицы в MATLAB?

Как создать подматрицу (все 5 * 5) из матрицы в MATLAB? Это можно сделать, сдвинув ровно одну строку и один столбец. Я пробовал использовать следующий код, но не получаю фактического результата. Здесь 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

Что мне нужно изменить в моем коде?


person Arijit Panigrahi    schedule 23.01.2019    source источник


Ответы (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.)

person Mefitico    schedule 23.01.2019
comment
Это ошибка, которую я получаю. Ошибка при использовании сохранения. Невозможно записать файл B_1_1.mat: доступ запрещен. Ошибка при новом тестировании (строка 9) save (['B _', num2str (i), '', num2str (j), '. Mat'], 'B') Ошибка при использовании сохранения. Невозможно записать файл B_1_1. мат: в разрешении отказано. Ошибка при новом тестировании (строка 9) save (['B', num2str (i), '_', num2str (j), '. Mat'], 'B') - person Arijit Panigrahi; 23.01.2019
comment
Странный. Вы работаете с папкой, в которой у вас есть права на запись? Попробуйте сохранить в другом месте, возможно, с другим именем, например C_1_1.mat. Между тем, матрицы B появились на консоли так, как вы хотели? - person Mefitico; 23.01.2019
comment
Да, в консоли появляются B-матрицы, но эта ошибка есть. Другое дело, что как мне использовать все эти матрицы 5 * 5? Поскольку мне нужно обновить все значения матриц с помощью формулы, тогда все обновленные матрицы 5 * 5 должны быть сохранены в другой переменной. - person Arijit Panigrahi; 23.01.2019
comment
В качестве быстрого исправления на ум приходит ужасная функция eval. eval ('B _', num2str (i), '_', num2str (j), '= B;') должен связывать каждое значение B с переменными с именем B_1_1 и так далее. Тогда все они будут у вас на рабочем месте. - person Mefitico; 23.01.2019
comment
@ArijitPanigrahi: Я только что попытался воспроизвести вашу ошибку, но мне это не пришло в голову. Ошибка решена за вас? Вам нужно было что-нибудь исправить? - person Mefitico; 24.01.2019
comment
вы пробовали eval ('B _', num2str (i), '_', num2str (j), '= B;') вместо сохранения файлов? - person Mefitico; 24.01.2019

Повторяющееся отображение связано с отсутствием точки с запятой в строке, где вы сохраняете подматрицы в B. Ожидаемый результат требует такой индексации:

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

а затем вы можете использовать celldisp(B) для отображения ячеек.

Пожалуйста, также предварительно выделите массив ячеек перед циклом с помощью B=cell(2, 2);

person Sardar Usama    schedule 23.01.2019