Репликация матриц наружу от центральной точки

StackOverflow https://stackoverflow.com/questions/7835541

  •  27-10-2019
  •  | 
  •  

Вопрос

Я совершенно новичок в программировании, поэтому я ищу некоторых экспертов, чтобы подтолкнуть меня в правильном направлении, когда я выполняю это упражнение.

Я использовал Horzcat и Vertcat, чтобы сделать это вручную, но я спрашиваю, знает ли кто -нибудь более простой способ.

Матрица 1 составляет 18x18 и индексированная горизонтально, начиная с 1.

Матрица 1 находится в центре и представляет собой дискретное пространство. Матрица 2,3,4,5,6,7,8,9 - это повторения матрицы 1, также представляют собой дискретные пространства и расположены вправо, внизу справа, внизу, внизу слева, слева, вверху, вверху и вверху справа.

Матрица 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, также репликации матрицы One и Surround Matrix 2–9. Матрицы, построенные вместе шаблон, как показано ниже. Каждая матрица сама по себе является отдельной единицей.

Если вы определите количество матриц, которые вам требуются, так что, скажем, в этом случае «49» или «4 шага от матрицы 1» (человек может прыгнуть с 1, 9, 25, 49 на диагонали или 1, 8, 23, 46 на прямой линии), как мне построить матрицы в этом шаблоне?

                      43  44  45  46 47  48 49
                      42  21  22  23 24  25 26
                      41  20  7   8   9  10 27
                      40  19  6   1   2  11 28
                      39  18  5   4   3  12 29
                      38  17  16  15  14 13 30
                      37  36  35  34  33 32 31     

Если я продемонстрирую это схемой, я надеюсь, что смогу лучше выразить свою проблему.

Итак, первое кольцо таково:

                               7 8 9
                               6 1 2
                               5 4 3

Второе кольцо таково:

                       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

Третье кольцо

                  43  44  45  46  47  48  49
                  42  21  22  23  24  25  26
                  41  20   7   8   9  10  27
                  40  19   6   1   2  11  28
                  39  18   5   4   3  12  29
                  38  17  16  15  14  13  30
                  37  36  35  34  33  32  31

и так далее. Я хотел бы иметь возможность продолжить эту модель бесконечно.

Как лучше всего сделать это в Matlab?

Прошу прощения за отсутствие ясности и мне нужно лучше выразить свою проблему. Все ваши комментарии очень полезны для того, чтобы показать мне, как написать правильную проблему.

Большое спасибо за вашу помощь, ребята. Только что присоединился к этому форуму, так как поддержка здесь является исключительной.

Это было полезно?

Решение

Если все ваши матрицы действительно копии («репликаты») начального (называйте это mat18), для тебя nШаг вы могли бы просто позвонить

largemat=repmat(mat18, 2*n+1, 2*n+1);

например

largemat=repmat(mat18, 7,7);

Чтобы создать матрицу, которую вы описали в своем примере. Как говорит Клемент, это создает большую матрицу напрямую, а не путем расширения существующей.

Обновление 2

Если ваши матрицы разные, например, у вас 49 матриц, хранящихся в клеточный массив mymatrices{1}, mymatrices{2}, ... mymatrices{49}, вы начнете с

largemat{1}=mymatrices{1};

Теперь, чтобы рассчитать следующее largemat{n+1} из mymatrices а также largemat{n}, вам нужно добавить следующие Mymatrices "вокруг" largemat{n}. largemat{n} уже содержит первое m^2 матрицы с m=2*n+1, так что вам понадобится mymatrices{(m^2+1):((m+2)^2)} и правильно их организуйте:

а затем на каждом шаге увеличивает это

largemat{n+1} = [ largemat{n} cell2mat(mymatrices(m^2+(1:m))')]; %# add to the right
largemat{n+1} = [ largemat{n+1} ; cell2mat(mymatrices(m^2+m+(m+1:-1:1)))]; %# add at bottom
largemat{n+1} = [ cell2mat(mymatrices(m^2+2*m+1+(m+1:-1:1))') largemat{n+1}]; %# add at right
largemat{n+1} = [ cell2mat(mymatrices(m^2+3*m+2+(1:m+2))) ; largemat{n+1}]; %# add at top

Чтобы проверить этот код, давайте используем простые числа для ваших подводных приложений:

mymatrices=mat2cell(1:49,1,ones(1,49));

Теперь мы можем запустить приведенный выше код в цикле, печатая промежуточные результаты, чтобы проверить:

largemat{1}=mymatrices{1};
for n=1:3
    m=2*n-1;
    largemat{n+1} = [ largemat{n} cell2mat(mymatrices(m^2+(1:m))')]; %# add to the right
    largemat{n+1} = [ largemat{n+1} ; cell2mat(mymatrices(m^2+m+(m+1:-1:1)))]; %# add at bottom
    largemat{n+1} = [ cell2mat(mymatrices(m^2+2*m+1+(m+1:-1:1))') largemat{n+1}]; %# add at right
    largemat{n+1} = [ cell2mat(mymatrices(m^2+3*m+2+(1:m+2))) ; largemat{n+1}]; %# add at top
    largemat{n+1}
end

Что печатает

ans =
     7     8     9
     6     1     2
     5     4     3
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
ans =
    43    44    45    46    47    48    49
    42    21    22    23    24    25    26
    41    20     7     8     9    10    27
    40    19     6     1     2    11    28
    39    18     5     4     3    12    29
    38    17    16    15    14    13    30
    37    36    35    34    33    32    31

Чтобы проверить его, также работает для некаларных входных матриц, использовать

mymatrices=cell(1,49);
for i=1:49,mymatrices{i}=rand(9,9),end;

в качестве ввода, который не сбивается с падением ... хотя я не проверял вручную, что полученная матрица верна ;-).

Другие советы

Вероятно, проще написать функцию, которая генерирует всю вашу матрицу для заданного количества слоев вместо того, чтобы пытаться расширить существующую матрицу с новым слоем.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top