从中心点向外复制矩阵

时间:2011-10-20 11:54:11

标签: matlab matrix repeat spiral

我对编程很陌生,所以我正在寻找一些专家,在我完成这个练习时,我会朝着正确的方向推动我。

我已经使用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中执行此操作的最佳方法是什么?

我为自己缺乏明确性而道歉,需要更好地表达我的问题。您的所有评论都非常有助于向我展示如何撰写正确的问题。

非常感谢你的帮助。刚刚加入这个论坛,因为这里的支持是特殊的。

2 个答案:

答案 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)

编写一个函数可以更简单地为给定数量的层生成所有矩阵,而不是尝试使用新图层扩展现有矩阵。