Создать спиральную матрицу Matlab - PullRequest
0 голосов
/ 03 апреля 2020

Может ли помочь создание спиральной матрицы в Matlab, используя только условия loops и if else.

Например, n=5, спиральная матрица:

17    16    15    14    13
18     5     4     3    12
19     6     1     2    11
20     7     8     9    10
21    22    23    24    25

Ответы [ 3 ]

3 голосов
/ 04 апреля 2020

Попробуйте:

nn = input('');
n = floor(1+(nn)/2);
a = zeros(nn,nn);
i=n;j=n;m=1;br=true;
if rem(nn,2)==0
    j=n-1;
    nn=nn+2;
end
for p=1:2:nn
    k=0;
    while k<p-2
        k=k+1;
        a(i,j)=m;
        i=i-1;
        m=m+1;
    end
    k=0;
    while k<p-1
        k=k+1;
        a(i,j)=m;
        j=j-1;
        m=m+1;
    end
    k=0;
    while k<p-1
        if j<1
            br = false;
            break
        end
        k=k+1;
        a(i,j)=m;
        i=i+1;
        m=m+1;
    end
    if ~br
        break
    end
    k=0;
    while k<p
        k=k+1;
        a(i,j)=m;
        j=j+1;
        m=m+1;
    end
end
disp(a)

Вот примерный прогон:

Enter the number:

5

    17    16    15    14    13
    18     5     4     3    12
    19     6     1     2    11
    20     7     8     9    10
    21    22    23    24    25

Еще один, на этот раз с четным числом:

Enter the number:

6

    36    35    34    33    32    31
    17    16    15    14    13    30
    18     5     4     3    12    29
    19     6     1     2    11    28
    20     7     8     9    10    27
    21    22    23    24    25    26

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

3 голосов
/ 04 апреля 2020

В вашей установке MATLAB есть функция spiral, которая делает именно то, что вы хотите.

>> spiral(5)

ans =

    21    22    23    24    25
    20     7     8     9    10
    19     6     1     2    11
    18     5     4     3    12
    17    16    15    14    13

Вы можете просмотреть исходный код, набрав edit spiral

2 голосов
/ 04 апреля 2020

Вот пользовательская функция SpiralMatrix для построения спиральной матрицы по вашему запросу

function M = SpiralMatrix(n)
  M = zeros(n);
  %  start from element M(1,1)
  i = 1;
  j = 1;
  s = 1; % first element assigned to M(1,1)
  M(i,j) = s;
  while true
    %  fill row from left to right
    idx = find(M(i,:)==0,1,'last');
    M(i,j:idx) = s + (0:(idx-j));
    s = s + idx - j;
    j = idx;

    %  fill column from top to bottom
    idx = find(M(:,j)==0,1,'last');
    M(i:idx,j) = s + (0:(idx-i));
    s = s + idx - i;
    i = idx;

    %  fill row from right to left
    idx = find(M(i,:)==0,1,'first');
    M(i,j:-1:idx) = s + (0:(j-idx));
    s = s + j - idx;
    j = idx;

    % fill column from bottom to top
    idx = find(M(:,j)==0,1,'first');
    M(i:-1:idx,j) = s + (0:(i-idx));
    s = s + i-idx;
    i = idx;

    % break if matrix if fully filled       
    if nnz(M) == n^2
      break;
    end
  end
  M = n^2+1-fliplr(flipud(M));
end 

, такой что

>> SpiralMatrix(5)
ans =

   17   16   15   14   13
   18    5    4    3   12
   19    6    1    2   11
   20    7    8    9   10
   21   22   23   24   25

>> SpiralMatrix(7)
ans =

   37   36   35   34   33   32   31
   38   17   16   15   14   13   30
   39   18    5    4    3   12   29
   40   19    6    1    2   11   28
   41   20    7    8    9   10   27
   42   21   22   23   24   25   26
   43   44   45   46   47   48   49
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...