gpt4 book ai didi

matlab - 从中心点向外复制矩阵

转载 作者:行者123 更新时间:2023-12-04 06:10:33 25 4
gpt4 key购买 nike

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

我已经使用 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你可以调用的步骤

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

例如
largemat=repmat(mat18, 7,7);

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

更新 2

如果您的矩阵不同,例如您有 49 个矩阵存储在 cell array 中。 mymatrices{1} , mymatrices{2} , ... mymatrices{49} ,你会从
largemat{1}=mymatrices{1};

现在计算下一个 largemat{n+1}来自 mymatriceslargemat{n} ,您需要在 largemat{n} 周围添加下一个 mymatrices。 . 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;

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

关于matlab - 从中心点向外复制矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7835541/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com