Search Results

Mathematica 循环计算效率

这两天帮欧洲的研究小组处理试验数据,就是计算试验数据的 Radial Distribution Funcito […]

这两天帮欧洲的研究小组处理试验数据,就是计算试验数据的 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秒。定义入下图。

Comments (2)

Mathematica 7.0 三维绘图

称赞一下这个Mathematica 版本里,在三维绘图上的改进。以前(Mathematica 5.0的情况), […]

称赞一下这个Mathematica 版本里,在三维绘图上的改进。以前(Mathematica 5.0的情况),画一个复杂的球体集合(约5000个圆球),一般需要20分钟,而每次改变视角,都需要另外改变程序,然后20分钟左右的时间重画。估计是程序里实现的问题,把球画成表面,然后一个一个表面渲染。一怒之下,写了个基于OpenGL的程序,绘图达到毫秒量级。那个“20分钟”,其实就是石器时代的标准。

最近,开始用Mathematica 7.0,发现三维绘图上有了明显的改进。同样的问题,同样的硬件条件,已经从20分钟改进到20秒。视角的转动也是可以通过鼠标实现的。另外,帮助系统也比原来的强大了不少,一个命令的参数,可以用一个F1就找到。

实验室里,关于这个版本,有3个人在使用。我和办公室里的豪哥,都是在私人笔记本上装了D版的。另外一个,是在大学工作的B,坚持使用正版。先申请大学的注册码,传真资料以后,花了3周时间审核,终于给了一个DEMO版本的,还是6.0版的。B使用了10几天后,软件到期,被锁定了。使用的时间,竟然比审核的时间还短。然后再去大学审核,花了若干周的时间,说需要先打开软件,输入密码就可以。问题是软件被锁打不开,需要密码;而输入密码,又需要打开软件。属于死循环。B一怒之下,改装D版,那天吃饭的时候还在说,其实还是D版的支持好。

Comments (1)

New Category: Mathematica and Chaos

In this new Category, named "Mathematica", I […]

In this new Category, named "Mathematica", I have a very simple idea about collecting some sorts of Chaos (also Fractal...), and using Mathematica to see what happens in these nonlinear systems. When I first touched with the word Chaos (the translation of this word in Chinese pronounces like HunDun), I was attracted by the vivid graphical expression of all these pure mathematical behaviour. And that is really fun for me, so the aim of this new category is to show how beautiful Science will be.
 
All articles in this category will be writen in English, because usually discussing "Science" in English is more convenience.
 
 
 

Comments (3)

2018年年度计划进展评估

今天是2018年最后一天。在做2019年年度计划之前,应该对今年的计划做个Review。做完结果如下图。年度计 […]

今天是2018年最后一天。在做2019年年度计划之前,应该对今年的计划做个Review。做完结果如下图。年度计划年年做,但是不要忘记下面几点:

  1. 每个项目都要有一个定性或者定量的标准,利于追踪数字化的进展;
  2. 写下计划以后,要有行动,要有定期和不定期的Review,Plan-Do-Review 是个循环;
  3. 除了每年的计划外,应该还有几个中长期的计划,例如,“五年”、“十年”、“人生”计划;
  4. 找到平衡,我这里的方法是分成“职业发展”、“个人发展”和“家庭”三个方面。

The last day in 2018. Before writing down your 2019 goals, I did a review on my 2018 ones. This is the progress at the last day of 2018 @year_progress, using @WolframResearch #Mathematica.

发表评论

一个关于数学软件的问答 (Q&A)

这个是一个在StackExchange 论坛上的问答 Q&A,关于Mathematica。问题十分简单 […]

这个是一个在StackExchange 论坛上的问答 Q&A,关于Mathematica。问题十分简单,哪里去找学这个数学软件的资源。看看下面的回复,简直就是可以写出一本书的内容。不对,那信息量比一本,甚至一系列教程多得多得多得多得多(注意,这个不是口吃)

Really good collection of resources for learning Mathematica, via goo.gl/OBVrcm

主要的是,这个回答(或者说回答系列)的详细程度,回答者的专业程度,让人叹为观止。另外就是可以看到社区的重要性,应该也是这些回答者们帮助他人的动力。这样的网络讨论,应该说是在英文社区中比较多见。

发表评论