Репликация матриц наружу из центральной точки - PullRequest
2 голосов
/ 20 октября 2011

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

Я использовал 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 также являются копиями матрицы один и окружают матрицы 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?

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

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

Ответы [ 2 ]

2 голосов
/ 20 октября 2011

Если все ваши матрицы действительно являются копиями («копиями») исходной (назовите ее 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;

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

1 голос
/ 20 октября 2011

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

...