Репликация матриц наружу от центральной точки
Вопрос
Я совершенно новичок в программировании, поэтому я ищу некоторых экспертов, чтобы подтолкнуть меня в правильном направлении, когда я выполняю это упражнение.
Я использовал 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;
в качестве ввода, который не сбивается с падением ... хотя я не проверял вручную, что полученная матрица верна ;-).
Другие советы
Вероятно, проще написать функцию, которая генерирует всю вашу матрицу для заданного количества слоев вместо того, чтобы пытаться расширить существующую матрицу с новым слоем.