我对编程很陌生,所以我正在寻找一些专家,在我完成这个练习时,我会朝着正确的方向推动我。
我已经使用horzcat和vertcat手动执行此操作,但我在问是否有人知道更简单的方法。
矩阵1为18x18,从1开始水平索引。
矩阵1位于中心并代表一个离散空间。矩阵2,3,4,5,6,7,8,9是矩阵1的重复,也代表离散空间,位于右,右下,左下,左下,左上,右上和右上。 / p>
Matrix 10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25也是矩阵1和环绕矩阵2到9的重复。矩阵一起构建形成如下的模式。每个矩阵本身都是一个独立的单元。
如果你定义了你需要的矩阵数,那么让我们说在这种情况下'49'或'矩阵1中的4步'(一个人可以从对角线上的1,9,95,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中执行此操作的最佳方法是什么?
我为自己缺乏明确性而道歉,需要更好地表达我的问题。您的所有评论都非常有助于向我展示如何撰写正确的问题。
非常感谢你的帮助。刚刚加入这个论坛,因为这里的支持是特殊的。
答案 0 :(得分:2)
如果你的所有矩阵都是真正的副本(“复制”),那么对于你的mat18
步骤你可以打电话
n
e.g。
largemat=repmat(mat18, 2*n+1, 2*n+1);
生成您在示例中描述的矩阵。正如克莱门特所说,这会直接创建大矩阵,而不是通过扩展现有矩阵。
更新2
如果您的矩阵不同,例如,您在cell array largemat=repmat(mat18, 7,7);
,mymatrices{1}
,... mymatrices{2}
中存储了49个矩阵,你将从
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
作为输入,不会崩溃...即使我没有手动检查结果矩阵是否正确; - )。
答案 1 :(得分:1)
编写一个函数可以更简单地为给定数量的层生成所有矩阵,而不是尝试使用新图层扩展现有矩阵。