我有一个用户输入(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
我可以使用循环来做到这一点但是如何使用数组函数来实现这一点?
答案 0 :(得分:2)
首先创建一个矩阵,其中每行从{1}到i
行i
,然后将矩阵的上三角形(包括对角线)设置为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行到i
行i
行,我们可以使用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 = {};