您好、欢迎来到现金彩票网!
当前位置:2019跑狗图高清彩图 > 向量化 >

如何用 Python 科学计算中的矩阵替代循环

发布时间:2019-08-09 22:28 来源:未知 编辑:admin

  深层次的原因涉及到Mathematica的底层实现所以我不太懂,但是至少从下面几个例子可以看出Mathematica里确实有很多比循环更好的方法

  (*其中N@i的作用是把整数i转化为浮点数,类似于C里的double*)

  然后一个有一定Mathematica经验的同学多半会知道同样作为循环的Do速度比For快,于是他可能会这么写

  然后一个有一定Mathematica经验的同学多半会知道同样作为循环的Do速度比For快,于是他可能会这么写

  当然了知道Do速度比For快的同学不太可能不知道Sum函数,所以上面其实是我口胡的,他应该会这么写

  如果这位同学还知道Listable属性并且电脑内存不算太小的话,他也可能会这么写

  当然了这只是一个最简单的例子,而且如果数据量更大的话最后一种方法就不能用了。但是这也足以说明在求和时用循环是低效的,无论是内置的Sum函数还是向量化运算,在效率上都远远高于循环

  (这部分模仿了不同程序员如何编写阶乘函数这篇文章,强烈推荐对Mathematica有兴趣的同学去看看)

  接下来举一个迭代的例子,(即Logistic map),取,为了测试运行时间同样取n=10^6

  (Do循环和For类似,篇幅所限这里就不写了,有兴趣的同学可以自行尝试)

  (Do循环和For类似,篇幅所限这里就不写了,有兴趣的同学可以自行尝试)

  当然了Nest的使用涉及到纯函数,对于Mathematica初学者来说可能有些难以理解,而且一些比较复杂的迭代不太容易写成Nest的形式,但是在迭代时Nest(还包括Fold)的效率确实要好于循环

  当然了Nest的使用涉及到纯函数,对于Mathematica初学者来说可能有些难以理解,而且一些比较复杂的迭代不太容易写成Nest的形式,但是在迭代时Nest(还包括Fold)的效率确实要好于循环

  依然举一个简单的例子:求一个列表中偶数的个数。为测试生成10^6个1到10之间的随机整数

  保留上面的思路,单纯的将For循环改为Scan (相当于没有返回结果的Map),代码如下

  (*用Map对list中的每个数判断是否偶数,然后用Count数出结果中True的个数*)

  (*利用EvenQ的Listable属性直接判断list的每个数是否偶数,然后数出结果中True的个数*)

  这个遍历的例子举得不算特别恰当,但也能说明一些问题了:Mathematica中内置了许多神奇的函数,其中大部分只要使用得当效率都比循环高(而且不是一点半点)。就算非要用循环,也要记得(任何能用Do代替For的时候)

  这个遍历的例子举得不算特别恰当,但也能说明一些问题了:Mathematica中内置了许多神奇的函数,其中大部分只要使用得当效率都比循环高(而且不是一点半点)。就算非要用循环,也要记得(任何能用Do代替For的时候)

  这个例子来自如何用 Python 科学计算中的矩阵替代循环? - Kaiser 的回答,我只是把代码从Python翻译成了Mathematica而已。选这个例子是因为它有比较明确的物理意义,而且效率对比非常明显

  运行结果For循环用时136秒,矩阵运算用时不足0.5秒,且两者答案完全一样。在算法完全相同的情况下两种写法有着超过200倍的效率差距

  这个答案其实从一开始就跑题了,还写了这么长的目的就在于希望让大家切实地感受到循环的低效并安利一下Mathematica中其它高效的方法。正如wolray的答案中说的,既然选择了使用Mathematica就应该多利用些MMA独有的美妙函数,毕竟如果只是用循环的话C和Fortran之类的语言效率比MMA不知高到哪里去了。。。。。。

  然我也不是让大家就不用循环了,毕竟很多时候循环的直观性和易读性带来的便利远远比那点效率重要。只是希望大家在循环之前能稍稍想一下,自己的目的是不是

  一定要用循环?可不可以用内置函数代替循环?就像上面的几个例子,将循环换成内置函数程序的简洁性和效率都大幅提高,长此以往相信你一定会爱上MMA的~

  MMA中如果一定要使用循环又对效率有一定要求的话,可以选择使用编译,效率能有极大的提高。比如上面的第4个例子使用Complie编译过后的Do循环

  前3个例子也都可以通过编译提速很多,这里就不放代码了,有兴趣的同学可以自己动手试一试,如果遇到问题欢迎在评论中与我交流。

  需要注意的是编译有很多注意事项,这里推荐一篇写的很好的教程,编译中常见的问题里面都有很好的讲解:怎样编译(Compile)/编译的通用规则/学会这6条,你也会编译

http://chinoamobi.com/xianglianghua/379.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有