【问题标题】:Replicating matrices outwards from a central point从中心点向外复制矩阵
【发布时间】:2011-10-20 11:54:11
【问题描述】:

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

我已经使用 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 中最好的方法是什么?

对于我的表述不够清晰,我需要更好地表达我的问题,我深表歉意。您所有的 cmets 都非常有用,可以向我展示如何编写正确的问题。

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

【问题讨论】:

  • ...不清楚你想要什么。 “添加空格”? “另外 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。我添加了一个更好的解释。谢谢你们的cmets!他们很有帮助!

标签: matlab matrix repeat spiral


【解决方案1】:

如果您的所有矩阵都是初始矩阵的真正副本(“复制”)(称为 mat18),那么对于您的 nth 步骤,您只需调用

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

例如

largemat=repmat(mat18, 7,7);

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

更新 2

如果您的矩阵不同,例如,您有 49 个矩阵存储在 cell array mymatrices{1}mymatrices{2}、...mymatrices{49},您可以从

largemat{1}=mymatrices{1};

现在要从mymatriceslargemat{n} 计算下一个largemat{n+1},您需要“围绕”largemat{n} 添加下一个 mymatrices。 largemat{n} 已经包含第一个带有m=2*n+1m^2 矩阵,因此您将需要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;

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

【讨论】:

  • 感激不尽。与此同时,我正在试用您的代码。
  • @BD020:我刚刚发布了一个更正的版本 - 请注意我之前忘记的 cell2mat 的使用!
  • 进一步试验!如果上面的每个单元格都有一个向量,我可以将值从一个向量转移到另一个向量吗?我可以将每个向量的行值的 5% 转移到所有其他向量行,仅转移到我指定的矩阵周围的矩阵(例如,如果我指定 1,则 2 到 9 个向量接收向量 1 总数的 5%。)所以第 1 行向量一移动到向量二、三等的第一行。你会推荐什么方法?我目前正在手动操作。非常感谢您的宝贵时间! (我应该重新问这个问题吗?)
  • 这绝对是一个新问题;确保从新问题链接到这个问题!试着解释清楚,也许用不同的词解释两次,并举一个小例子!
【解决方案2】:

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

【讨论】:

  • 我会对此进行研究。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多