Matlab 从中心点向外复制矩阵

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的复制品。

我对编程很陌生,所以我正在寻找一些专家,在我完成这项练习的时候,他们可以帮助我朝着正确的方向前进

我已经使用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跳下),我如何以这种模式构建矩阵

                      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}
周围添加下一个MyMatrix
largemat{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;