Matlab 从中心点向外复制矩阵
我对编程很陌生,所以我正在寻找一些专家,在我完成这项练习的时候,他们可以帮助我朝着正确的方向前进 我已经使用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也是矩阵1和环绕矩阵2至9的复制品。组合在一起的矩阵形成如下模式。每个矩阵本身就是一个离散单元 如果您定义了所需矩阵的数量,那么在本例中,假设“49”或“矩阵1的4个步骤”(一个人可以从对角线上的1、9、25、49或直线上的1、8、23、46跳下),我如何以这种模式构建矩阵Matlab 从中心点向外复制矩阵,matlab,matrix,repeat,spiral,Matlab,Matrix,Repeat,Spiral,我对编程很陌生,所以我正在寻找一些专家,在我完成这项练习的时候,他们可以帮助我朝着正确的方向前进 我已经使用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也是矩阵1和环绕矩阵2至9的复制品。
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
th步骤,您只需调用
largemat=repmat(mat18, 2*n+1, 2*n+1);
e、 g
生成您在示例中描述的矩阵。正如克莱门特所说,这直接创建了大型矩阵,而不是通过扩展现有矩阵
更新2
如果您的矩阵不同,例如,您有49个矩阵存储在mymatrices{1}
,mymatrices{2}
<代码>我的矩阵{49},您可以从
largemat{1}=mymatrices{1};
现在要从MyMatrix
和LargeMatt{n}
计算下一个LargeMatt{n+1}
,需要在LargeMatt{n}
周围添加下一个MyMatrixlargemat{n}
已经包含第一个m^2
矩阵,其中m=2*n+1
,因此您需要mymatrix{(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;
作为输入,它不会崩溃。。。即使我没有手动检查结果矩阵是否正确;-) 。。。不清楚你想要什么。“添加空格”?“另外8个矩阵”,你是说“8个矩阵元素”?什么是双打?你说的层是什么意思。。。对不起,我觉得这很难解释。每个矩阵代表一个空间。我想在同心环中添加一个矩阵的副本。矩阵1是18x18。矩阵2、3、4、5、6、7、8、9是矩阵1的复制品,但位于右下、右下、左下、左上、左上、右上。加倍是指如果1在中间,则1周围有8个,然后8周围有16个,以此类推。也许你可以使用问题下方的“编辑”链接来改进你的文本,并将你所说的纳入评论中。“加倍”在这里有点奇怪,因为你的子矩阵数量增加了1->9->25->49->81,所以你加的数字是8,16,24,32。。。所以,如果你理解正确,没有什么是加倍的。对不起,我解释得很糟糕。倍增幅度仅为8比16。这个模式实际上是1 8 16 24 32。我加了一个更好的解释。谢谢你的评论!他们很有帮助!我将对此进行研究。谢谢你,真是太感谢你了。我正在试用你的代码。@BD020:我刚刚发布了一个更正的版本-注意我以前忘记的
cell2mat
的用法!进一步试验!如果上面的每个单元格都有一个向量,我能把值从一个向量移到另一个向量吗?我是否可以将每个向量行值的5%转移到所有其他向量行,仅转移到我指定的矩阵周围的矩阵(例如,如果我指定1、2到9个向量,则接收向量1总数的5%),那么向量1的第一行移到向量2、3等的第一行。您建议采用什么方法?我现在是手工做的。非常感谢您的时间!(我应该把这当作一个问题吗?)这绝对是一个新问题;确保从新问题链接到此问题!试着解释清楚,也许用不同的词解释两次,并举一个小例子!
mymatrices=cell(1,49);
for i=1:49,mymatrices{i}=rand(9,9),end;