在上一篇 blog 中我提到了递归图片,还给了一个有趣的例子,这次还说递归图片,再给另一个例子:
不过这次的例子是我自己生成的,而篇 blog 就是要讲如何来生成这样一张递归图片。其实方法很简单,类推一下,多花一些功夫的话,之前给的那个“二次递归”的例子也是可以“轻松”做出来的。
|
||||||
|
在上一篇 blog 中我提到了递归图片,还给了一个有趣的例子,这次还说递归图片,再给另一个例子: 不过这次的例子是我自己生成的,而篇 blog 就是要讲如何来生成这样一张递归图片。其实方法很简单,类推一下,多花一些功夫的话,之前给的那个“二次递归”的例子也是可以“轻松”做出来的。 在 Matlab 里使用 mex 来编译 C/C++ 代码失败,这个问题算是困扰了我好几个月了,主要是我的环境比较恶劣:系统是 Arch Linux ,感觉这个系统比较喜欢追求最新版本,比较无视老版本软件的兼容性问题吧。再加上系统是 64 位的,出现各种兼容性问题似乎也觉得是理所当然的,然后像 Matlab 这样的软件通常使用较老版本的 GCC ,而 GCC 更新的时候又做了一些大改动,总之结果是我每次试图编译的时候都得到类似这样的错误: /usr/lib/gcc/x86_64-unknown-linux-gnu/4.4.2/cc1: /opt/matlab/sys/os/glnxa64/libstdc++.so.6: version `GLIBCXX_3.4.11′ not found (required by /usr/lib/libgmpxx.so.4) 因为 GCC 新版本里把 GLIBCXX_3.4.11 这个符号去掉了,所以挂掉了。搞得我每次需要运行 mex 编译的代码都要放到另外一台 Windows 机器上跑。也 Google 了很多次都没有找到解决方案。今天一怒之下用了最暴力的方法:/opt/matlab/sys/os/glnxa64/libstdc++.so.6 其实是指向该目录下的另一个文件 libstdc++.so.6.0.9 的软连接,我将他改成指向系统里的新版本的 libstdc++:/usr/lib/libstdc++.so.6.0.13 ,结果问题解决了。那个目录下还有一个 README ,说了这几个文件是从 GCC distribution 里拷贝过来的。于是这样用新版本覆盖应该不会有太大的问题吧? 至少目前还没有出什么问题的。 实际上关于 Matlab 和 Python 的争论和比较已经非常非常多了。Matlab 本来是在相关领域可以算作“标准”的平台和工具了,然而 Python 有了 numpy ,又有了 scipy ,似乎相当有潜力和 Matlab 一较高下。在 scipy 的网站上有一个页面专门讲 Matlab 中常见的功能和函数在 numpy 中如何实现:NumPy for Matlab Users。看起来似乎还挺不错的。所以我之前都有想在 scipy/numpy 的基础上搭建相关的平台的想法,并且我在“漫谈 Clustering 系列”的前面几篇文章中也使用了 Python 代码作为示例。但是在我写系列中的第 4 篇(关于 Gaussian Mixture Model )的时候,还是直接用了 Matlab 代码。因为在那个时候我已经暂时放弃了工作在 scipy/numpy 里的想法。下面我还是从我自己的角度来谈一谈我对两者比较吧。 要比较 Matlab 和 Python ,不得不说的就是 license 了,前者是非常典型的昂贵的商业软件,而后者是开源软件的典范。如果说其他方面差不多的话,对于个人、科研或者教育方面使用来说,应当更优先选择 Python 了。但是情况显然不是这么简单,而且若仅仅是考虑 Matlab 的那些特性的话,也有一个开源的 clone Octave 可供选择。而 Python 的魅力似乎更多地在于 Matlab [...] 我在上一篇文章中提到 Matlab 以加号开头的目录来表示一个 package ,但是文件名开头的加号对于 VIM 来说有特殊的意义,每次打开 +foo/bar.m 这样的文件的时候都要用 ./+foo/bar.m 这样的方式,非常麻烦。 虽然 VIM 那个脚本语言甚至比 Matlab 的脚本语言还要丑陋许多,但是至少也是号称扩展性超强的编辑器,我觉得这样的任务至少应该能自动化一下。Google 了一下,很快就找到了一个类似的帖子:vim: Modifying filename in bufreadpre? ,似乎和我这里遇到的问题如出一辙,问问题的人是想要用 : 来代替 $TMPDIR ,每次打开 :/foo 的时候能自动变成 $TMPDIR/foo 。 当然,做 Research ,或者说做实验,目的就是要跑出结果来,代码写成什么样子其实无关紧要,而且通常代码的生存时间(比起一般的项目代码来说)很短,大可以不必理会下面这个 tip : 不过,太乱的代码自己多少也有些看不顺眼,而且养成一个习惯毕竟也是好事,其实做实验的一些代码也是经常要重用的。特别是我现在这种状态,经常要作为苦力把各种算法拿过来跑一跑,做一个对比。其实除非是做那种完全纯理论的研究,一般都是需要实验来验证的,而做实验就必然要做对比,何老师经常说:“做 Research ,目的不是你的结果要有多好,关键的地方在于你要做得比所有现在已知的方法都要好。”其实也挺有道理的。不过这样一来,会有一些经常需要用来做比较的方法,这些代码在各个实验中其实是差不多的,也总会想着能够尽量地重用,而不是每次都重新写一遍或者 copy & paste (通常是诡异的 bug 滋生的温床)。 |
||||||
|
Copyright © 2010 Free Mind - All Rights Reserved |
||||||
Comments