From Cody Problem 18. Bullseye Matrix
靶心矩阵
解法一
Function a=bullseye(n)
a=toeplitz(1:n); %生成1到n的托普利兹矩阵
a=(a+rot90(a))/2; %rot90()逆时针旋转矩阵
end
托普利兹矩阵 简称T型矩阵。其主对角线上的元素相等,平行于主对角线的线上的元素也相等;矩阵中的各元素关于次对角线对称,为次对称矩阵。在matlab种可以利用toeplitz()命令生成。
解法二
Function a = bullseye(n)
a = ceil(sqrt(spiral(n))/2+0.5);
end
spiral(n)命令生成n维从1开始的顺时针螺旋矩阵,下面以spiral(9)为例。
螺旋矩阵A:右上角次对角线是1、9、25、49、81,也就是说第一圈是1一个元素,第二圈是 [2,9] 八个元素,第三圈是 [10,25] 十六个元素,第四圈是 [26,49] 二十四个元素……以此类推。
不难想到,如果对矩阵每个元素开方,得到一个新矩阵B:右上角次对角线是1、3、5、7、9,第一圈是 1 一个元素,第二圈是 (1,3] 八个元素,第三圈是 (3,5] 十六个元素,第四圈是 (5,7] 二十四个元素……以此类推。
如果想让一圈都是一个相同的整数元素,要么向上取整,要么向下取整,很显然 (1,3] 、 (3,5] 、 (5,7] 这样的区间跨度还是大了一点,所以,将新矩阵再除以2,得到矩阵C:右上角次对角线是0.5、1.5、2.5、3.5、4.5,第一圈是 0.5一个元素,第二圈是 (0.5,1.5] 八个元素,第三圈是 (1.5,2.5] 十六个元素,第四圈是 (2.5,3.5] 二十四个元素……以此类推。
现在每个区间的跨度都是1,但是错开了0.5,所以将C矩阵每个元素加0.5,得到矩阵D:右上角次对角线是1、2、3、4、5,第一圈是 1 一个元素,第二圈是 (1,2] 八个元素,第三圈是 (2,3] 十六个元素,第四圈是 (3,4] 二十四个元素……以此类推。
矩阵元素向上取整,结束。