这两天帮欧洲的研究小组处理试验数据,就是计算试验数据的 Radial Distribution Funciton (RDF),发现50,000个数据点,用Mathematica处理起来非常吃力。已经开始用C++写程序了,后来尝试另一种方法,找到的计算时间上的差异。
问题定义:列举寻找N个点之间的距离。实现方法有两种,计算复杂度都是 O(N^2)。Mathematica里可以用两种方法实现:(1)利用Subset函数罗列2个点的组合,然后计算距离(Euclidean Distance);(2)利用循环。程序如下:
NumG = 500; Data = RandomReal[1, {NumG, 3}];
(* Method 1: Use Mathematica in-build function *)
DistDistance = {};
Timing[DistDistance = EuclideanDistance @@@ Subsets[Data, {2}];][[1]]
(* Method 2: Use loops *)
DistDistance = {};
Timing[For[i = 2, i <= NumG, i++,
For[j = 1, j <= i - 1, j++, {dx = Norm[Data[[i]] - Data[[j]]]; AppendTo[DistDistance, dx];
}]];][[1]]
测试程序里,都用了500个随机点。前一种是抽象语言,实现时间大概是0.128秒*;而后者属于底端的循环定义,尽然用了44.9秒!而且前者与数据点数量符合O(N^2),后者在1000个点以上就根本无法处理了。
看来以后用Mathematica还是要多使用程序里的函数形式。
*硬件环境,MacBook Pro 2014。
[补注] 这个看来是和内存利用相关的。第二种方法采用了AppendTo 函数,在每个循环里都在进行内存的读写。尺寸大的算例里,内存可以用到10G以上。计算程序已经优化。
[补补注] 需要提高计算效率,可以采用几种不同的函数定义方式。上文提到的方法,其中输入函数,并没有确定数据类型。这个其实是Mathematica的优点之一。但是要进行循环计算的时候,就反倒有效率上劣势。其解决方法是换用函数定义方法。下面是几个实测的算例,都是 10^7 次循环。
定义一,函数定义采用 ":=",或者"Function[]",计算时间在70秒左右;
定义二,采用 Compile[],需要预先定义函数类型,计算时间10秒左右;
定义三,采用 Compile[],类似定义二,但是在最后制定编译类型,CompilationTarget->"C"。计算时间3.5秒。定义入下图。
由于合作者比较多,但是个人又喜欢LaTeX的风格,寻找拥有类似Google Docs的合作写作 (collaborative writing) 的平台。下面的几个关注了很久,都有收费的服务。支持多用户,协同编辑文档。
(1) Auhtorea: https://www.authorea.com/
(2) ShareLaTeX: https://www.sharelatex.com/
(3) writeLaTeX: https://www.overleaf.com/
和传统LaTeX编辑比较,这些服务都可以用浏览器编辑和预览,也就是说也适用于移动设备。文档都是云存储。可以协作编辑文档,有利于合作。这些服务还有一个好处就是,输出文档不一定是基于LaTeX的,也可以转换成别的格式,例如 MultiMarkdown 之类。现在关于未来Publishing的形式也是有不少的讨论。例如论文的出版,不仅仅限于打印版本,而更多的是应该基于网页的可读性。
由于最后还是商业模式运作,所以每个网站都弄出一堆不同的定价模式,每月的价格大都在10到20美元之间。
现在的需求是,有一个团队的空间,每个人都可以创建自己的文档,并且邀请合作者共同编辑。这个有点像具有 Project Management 特性的文档写作和编辑空间。估计是提的要求太多了,所以到现在还没有找到一个合适的工具。
这个是一个在StackExchange 论坛上的问答 Q&A,关于Mathematica。问题十分简单,哪里去找学这个数学软件的资源。看看下面的回复,简直就是可以写出一本书的内容。不对,那信息量比一本,甚至一系列教程多得多得多得多得多(注意,这个不是口吃)。
Really good collection of resources for learning Mathematica, via goo.gl/OBVrcm
主要的是,这个回答(或者说回答系列)的详细程度,回答者的专业程度,让人叹为观止。另外就是可以看到社区的重要性,应该也是这些回答者们帮助他人的动力。这样的网络讨论,应该说是在英文社区中比较多见。
这个像是一个小学/中学的命题作文。
但我这里写的是一件小事,就是“如果我是中国大学校长”,我会斥资重建大学校园里的所有的厕所。
当年,听一个法国同事说过,一个法国知名社会学家计划全家搬到桂林一家大学里,打算未来十年在中国大陆发展。结果来了三个月,全家就都又搬回到法国去了。主要的原因倒不是水土不服,文化差异,或者学术文化的不同,根本的理由是他难以接受大学里的厕所。。。
最近几次回国发现,几家大学校园里(除了最近新建的楼房),厕所的水平果然是有问题。还有就是异味难除,结果弄的楼道里面都是一股味道。这次参观了一大学科学馆,设备齐全,研究水平也是一流,结果实验室那层楼的厕所弄的,满楼飘“香”。
所以,基于以上的观察,如果我是中国大学校长,我会说,所谓世界性大学的建设,我看还是要从厕所开始。
近期评论