![5c96dae8399960989c0b2a4322a839d3.png](https://i-blog.csdnimg.cn/blog_migrate/983a54af8ecfd8827bcbbbf4e03a29b8.jpeg)
下边这幅作品是从Matlab帮助文件里边找出来的,查了一下百度,这是德国著名艺术家兼业余数学爱好者阿布列西特.杜勒早期的作品,叫做《文艺复兴雕版画——忧郁者I》。
![3c1d6caad9d774e3fac5a8edd1ac44cf.png](https://i-blog.csdnimg.cn/blog_migrate/38035d32665d82587a86e05c330cb759.jpeg)
这幅作品里边布满了各种各样的数学符号和几何图形,如果仔细观察的话就会发现在右上角有一个矩阵。那个就是奇妙的魔方矩阵,早在杜勒的时代人们就相信它有不可思议的性质:每一行,每一列,和对角线加起来均等于34。它的确具有值得人们去研究的神奇特性!
![267e9c00e65809fe26c1824b7c2bf703.png](https://i-blog.csdnimg.cn/blog_migrate/b1db69faeb7772abe93dc2bc486c7d4b.jpeg)
![954f3e5d3d419d66d46a978881d21507.png](https://i-blog.csdnimg.cn/blog_migrate/8f76589eebce03e72f96ac40ecbe7c4e.jpeg)
在Matlab里边,我们可以用一个函数来表示这个矩阵
>> magic(4)
ans =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
裸奔一个魔方矩阵感觉是不是怪怪的,但是,在matlab里边这样做是允许的。对于这种函数的返回值不知道赋值给谁的情况,Matlab的开发者设定了一个自动生成的ans变量帮你完成整个赋值操作(思维的周密有的时候也是聪明的一种体现,这帮Matlab开发者可是世界上最聪明的那波人)。接下去我们最好别裸奔了,试着来个变量,我比较喜欢长一点的意思比较清晰的变量名 O(∩_∩)O~
>> magic3Matrix = magic(3)
magic3Matrix =
8 1 6
3 5 7
4 9 2
咦~,咋magic函数里边的数值改了,原来是4,怎么现在改成3了,这是啥子情况?
最近袁部长说了,绝不让西方价值观进入大学!Magic(4)代表的是西方价值观,magic(3)代表的则是东方的价值观(别笑,我可是认真的!)。以后不许用magic(4),只许用magic(3)!
magic(3)的原型据说来自大禹治水遇到的一只乌龟。
![267e9c00e65809fe26c1824b7c2bf703.png](https://i-blog.csdnimg.cn/blog_migrate/b1db69faeb7772abe93dc2bc486c7d4b.jpeg)
![d2b6b69ff2449d068fcdc53bc98e7081.png](https://i-blog.csdnimg.cn/blog_migrate/83c4f2198ee47ad78ed4fbec26b9d780.jpeg)
在很久很久很久以前,大禹来到洛水(黄河支流洛河的古称)治理水患,在波涛汹涌的洛水中突然浮起一只巨大的乌龟,乌龟背上有一个神奇的图,图上有很多圈和点。大家都弄不明白,大禹数了一下乌龟背上的点数,再用数字表示出来,发现这里有非常有趣的关系。把龟甲上的数填入正方形的方格中,不管是把横着的三个数相加还是把竖着的三个数相加,或者是把斜着的三个数相加他们的和都等于15。以下是河图和洛书的图片,据说八卦就是起源于河图和洛书,这是不是说明那只乌龟不是普通的乌龟,是外星人为了开启我们祖先的智慧又不好意思露面... ... 咱们的祖先还是受到上天很大的眷顾的!
![267e9c00e65809fe26c1824b7c2bf703.png](https://i-blog.csdnimg.cn/blog_migrate/b1db69faeb7772abe93dc2bc486c7d4b.jpeg)
![f3a8450ed8eb308a1a00e0a7385510fe.png](https://i-blog.csdnimg.cn/blog_migrate/fd471abdae0f92b1aafbea6ce4e33158.jpeg)
如果看过黄日华版的《射雕英雄传》,应该会对“九宫之义,法以灵龟;戴九履一,左三右七,二四为肩,六八为足”这个口诀不会陌生。在《射雕》中郭靖黄蓉二人被铁掌水上漂裘千仞追到黑龙潭,躲进一个种满桃花树的园子里边,裘千仞居然怂了不敢进园子,说明这个园子的主人瑛姑绝对是个厉害角色(自己百度一下瑛姑是什么人物)。瑛姑给郭黄两人出了一道题:数字1~9填到3行3列的表格中,要求每行、每列、及两条对角线上的和都相等。这道题难倒了瑛姑十几年(欧卖糕,青春啊!青春),她把任务指导语念完之后,补了一句:答出来就救他们,答不出来两个人就别想活着离开!(好狠毒的女人)
![267e9c00e65809fe26c1824b7c2bf703.png](https://i-blog.csdnimg.cn/blog_migrate/b1db69faeb7772abe93dc2bc486c7d4b.jpeg)
![c91e4d5d6bfca22f916e7cbb4544d921.png](https://i-blog.csdnimg.cn/blog_migrate/ec1bece853e9d97239e2bdb2ce224cc0.jpeg)
黄蓉轻蔑地一笑,把九宫格的布局给说出来了“九宫之义,法以灵龟;戴九履一,左三右七,二四为肩,六八为足”,她一边说,郭靖一边用内力把围棋的棋子扔到墙上的九宫格里边。这是不是说明,桃花岛不是普通的岛,桃花岛主在教育方面很有一套。这是不是还说明,关键不是师父多和少的问题,关键是谁教的问题(一不小心把选导师很重要的道理给说出来了)。
等等!怎么这个“戴九履一,左三右七,二四为肩,六八为足”矩阵和之前呈现的magic3Matrix不一样啊!
之前的魔方矩阵:
magic3Matrix =
8 1 6
3 5 7
4 9 2
而现在的魔方矩阵:
jgtMatrix =
4 9 2
3 5 7
8 1 6
虽然都是3*3的矩阵,怎么是上下颠倒的?magic(3)有没有可能跑出洛水乌龟版的或者《射雕》黄蓉版的九宫图?
我们一起来试试:
>> magic3Matrix = magic(3)
magicMatrix =
8 1 6
3 5 7
4 9 2
>> magic3Matrix = magic(3)
magicMatrix =
8 1 6
3 5 7
4 9 2
纳尼~ 这不就是说明,magic(3)是固定的。
没错,magic(N)是固定的,而且貌似Matlab的开发者是故意的,他们居然敢把我们的jgtMagic 给弄颠倒了。这个实在不能忍,怎么办?有没有办法把它颠倒过来呢?
不就是第1行变成了第3行吗?我们给它重新排排:
magic3Arr_R1 = [8 1 6];
magic3Arr_R2 = [3 5 7];
magic3Arr_R3 = [4 9 2];
原来的矩阵 magic3Matrix = [magicArr_R1; magicArr_R2; magicArr_R3];
现在的改成 magic3Matrix = [magicArr_R3; magicArr_R2; magicArr_R1];
这里要停下来对几个知识点进行必要的说明:
1. magic3Arr_R1 这怎么解读呢?
(1)Matlab操作的对象是矩阵,一般我们管一行或者一列叫做向量,英文叫做Array。所以magic3后边的Arr是Array的缩写;
(2)R是Row的缩写,所以下滑线_后边跟的R1,代表第一行的意思;
2. magic3Arr_R1 = [8 1 6]; 这又怎么解读?
(1)这句话翻译过来就是 magic3的第一行向量等于 [8 1 6],中括号 [ ] 用来构建向量(Array)或者是矩阵(Matrix)的,在中括号中的 8 1 6 代表这个向量由三个元素组成,依次分别是8,1和6。
(2)这里又多了一个细节,我们之前写magic3Matrix = magic(3) 最后边是没有';'的,现在多了一个分号,有什么区别吗?分号在Matlab的脚本中代表的是一句话的结束,它的功能可以简单理解为:“如果有就不显示;如果没有就显示。”如果我们在Matlab命令窗口输入magic3Arr_R1 = [8 1 6],就会显示变量中元素的信息
>> magic3Arr_R1 = [8 1 6]
magic3Arr_R1 =
8 1 6
(3)magic3Arr_R1 = [8 1 6] 可以写成 magic3Arr_R1 = [8 1 6] 也可以写成 magic3Arr_R1 = [8,1,6] 也就是说,在matlab里边,你可以用空格‘ ’把元素间隔开,也可以用逗号‘,’把元素间隔开,它们是等价的。
3. magic3Matrix = [magicArr_R1; magicArr_R2; magicArr_R3]; 这里那么多';'是什么个意思?
矩阵中的';'和脚本语句结束位置的';'是不一样的,矩阵中的分号代表的是换行。
你想手动构建一个3*3的矩阵,第一行是 [1 2 3] 第二行是[4 5 6] 第三行是 [7 8 9],你可以这么写:
myMatrix = [1 2 3; 4 5 6; 7 8 9]
你也可以稍微麻烦些,写成
>> myMatArr_R1 = [1 2 3];
>> myMatArr_R2 = [4 5 6];
>> myMatArr_R3 = [7 8 9];
然后,
>> myMatrix = [myMatArr_R1; myMatArr_R2; myMatArr_R3]
myMatrix =
1 2 3
4 5 6
7 8 9
本质上前后两种写法是一样的。
![78a31d1cdea0ea6a75d08272baf65eaa.png](https://i-blog.csdnimg.cn/blog_migrate/f5d8a2edfdff7538adb84815111db76f.jpeg)
以上为了讲解方便,我采用了一种比较繁琐的方法,这让Matlab看起来非常的愚蠢,阿弥陀佛,罪过罪过!
我们可以用一个flipud对矩阵进行“以水平方向为轴的上下翻转”的操作。
>> myMatrix_UpDown = flipud(myMatrix)
myMatrix_UpDown =
7 8 9
4 5 6
1 2 3
怎么样?是不是瞬间觉得高大上了 O(∩_∩)O~
通过上边那张图可以看出magic(3)如果随机的话,应该有8种形态,要是能够把magic函数理解清楚了,就跟达芬奇能把鸡蛋画好是一样的。
现在,第二章的作业来了:如果让你写一个 superMagicFcn 函数,只针对输入参数是3的magic函数会呈现随机的3*3魔方矩阵,其他参数跟magic函数一样的话,在算法上你会怎么做?别找借口,我说的是算法,没说一定让你写出代码来,你要不要试试?
以下是本次课程的参考书:
![267e9c00e65809fe26c1824b7c2bf703.png](https://i-blog.csdnimg.cn/blog_migrate/b1db69faeb7772abe93dc2bc486c7d4b.jpeg)
![85d2a67104744dad3e7a145071f9c334.png](https://i-blog.csdnimg.cn/blog_migrate/2dc9be280ce42b37a245f1838d7be5f7.jpeg)
总之,要把Matlab学好,万一穿越了呢。你醒过来,看到不远处一个猥琐的老头正在施展登萍渡水的轻功杀气腾腾地向你靠近,那时候一定要冷静,拉着身边的mm看看哪个方向有种桃花的园子”... 要不是mm,是gg怎么办?那你且得记好了,再默念一遍“九宫之义,法以灵龟... ...”
作业的代码分享如下:
randMagic.m
![0a0943fb8b828ed71e790a04946ef453.png](https://i-blog.csdnimg.cn/blog_migrate/1fc2747de2850b85526719d031ac7164.jpeg)