横跨对角线的反射阵列

时间:2017-02-21 00:34:32

标签: arrays matlab matrix

我有一个用户输入(i)是一个奇数。我想创建一个数组i次。所以我做了以下几点:

reflect = zeros(i, i);

现在,我想生成一个包含沿主对角线反射的数字的数组。

如果i = 5,它将如下所示:

6 4 3 2 1 
1 6 3 2 1
1 2 6 2 1 
1 2 3 6 1  
1 2 3 4 6

我可以使用循环来做到这一点但是如何使用数组函数来实现这一点?

1 个答案:

答案 0 :(得分:2)

首先创建一个矩阵,其中每行从{1}到ii,然后将矩阵的上三角形(包括对角线)设置为0.一旦这样做,请使用此矩阵并将其旋转180度并创建另一个与矩阵大小相同的矩阵和一个沿对角线具有全部i + 1的附加矩阵,其中零被设置为其他所有并将所有矩阵加在一起:

i = 5;
M = repmat(1 : i, i, 1);
M(triu(M) ~= 0) = 0;
O = M + (i + 1)*eye(i) + rot90(M, 2);

让我们一次查看每行代码。第一行只定义了您拥有的大小矩阵,即i x i。接下来,我们创建一个矩阵M,从1行到ii行,我们可以使用repmat来帮助我们创建这个矩阵,方法是先将向量从1到i并垂直复制i次。接下来,我们使用triu函数,我们提取此矩阵的上三角部分,包括对角线,但我们将上三角部分中的所有元素都设置为0.我们只需将上三角部分与上三角部分进行比较非零并使用logical索引来帮助我们执行此操作。这将对角线和上三角形部分设置为0,其余部分保持不变。

最后,我们采用这个矩阵,并使用i + 1标识rot90的单位矩阵添加它,最后完成上半部分,我们只需使用{{3将相同的矩阵旋转180度将矩阵旋转90度,但是我们需要旋转180度,我们需要旋转90度两次,因此将第二个参数>> O O = 6 4 3 2 1 1 6 3 2 1 1 2 6 2 1 1 2 3 6 1 1 2 3 4 6 设置为2。

我们得到:

var fruits = {};