2

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

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

我为我的表述不够清楚而道歉,我需要更好地表达我的问题。您的所有评论对于向我展示如何编写正确的问题非常有用。

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

4

2 回答 2

2

如果您所有的矩阵都是初始矩阵的真正副本(“复制”)(调用它mat18),那么对于您的n第一个步骤,您可以调用

largemat=repmat(mat18, 2*n+1, 2*n+1);

例如

largemat=repmat(mat18, 7,7);

生成您在示例中描述的矩阵。正如 Clement 所说,这直接创建了大型矩阵,而不是通过扩展现有矩阵。

更新 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;

作为输入,它不会崩溃......即使我没有手动检查结果矩阵是否正确;-)。

于 2011-10-20T13:12:25.287 回答
1

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

于 2011-10-20T13:08:56.693 回答