situxuming situxuming
生活,一场竞技,每时每刻我都不断地要求超越自己!这样我才能成为生活强者!
关注数: 15 粉丝数: 101 发帖数: 1,593 关注贴吧数: 27
Function by Others Except Itself游戏,活跃下贴吧气氛 工作了之后就好久没来MMA吧活跃了。最近在学Haskell,看到有篇文章提到说,熟悉一门语言的有效方法是尽可能使用该语言的所有特性来实现其某内置函数的功能,但是除了使用该函数本身。想到MMA,就觉得应该也可以采用该方法来熟悉MMA的特性以及相关函数的使用了。 基于此,我就想到到贴吧里来发起这个游戏,游戏规则很简单:每个人都可以指定一个内置函数,然后尽可能多的采用其他方法(但是除了使用该函数本身)来实现该内置函数的功能,要求实现的功能要完全一致,例如函数A针对所有数据类型进行操作,那么其他实现方式也是要针对所有数据类型都具有一样的功能,这一点非常重要。 当然,其他人也可以对其进行补充,这样于己于人都是一次不错的学习过程。 好了,介绍就到此为止,下面我抛出个引子,例如MMA中选取列表最后一个元素的函数Last,可以采用以下方式来实现: ******************************************************************************************************************************************* test = {1, "abc", s, "a", Sin[3], 1.34, 6/5}; Fold[#2 &, test] First[Reverse[test]] test[[-1]] test[[-1]] Nest[Rest, test, Length@test - 1] // First test //. {x_, y__} :> {y} // First Take[test, -1] // First Drop[test, Length@test - 1] // First TakeDrop[test, -1][[1, 1]] Pick[test, SparseArray[{Length@test -> 1}], 1] // First Extract[test, -1] ************************************************************************************************************************************ 欢迎大家继续补充,后面的朋友继续 ^_^
不同质数因子NestWhile的改善 Project Euler上第47道题目,链接如下: http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fprojecteuler.net%2Fproblem%3D47&urlrefer=af027d927538678af2d155380b4d9894 最小的两个具有两个不同质数因子的连续整数是: 14 = 2 7 15 = 3 5 最小的三个具有三个不同质数因子的连续整数是: 644 = 2^2 7 23 645 = 3 5 43 646 = 2 17 19. 找出最小的四个具有四个不同质数因子的整数。它们之中的第一个是多少? ****************************************************************************** 最容易想到的是用NestWhile,自己写的程序如下: NestWhile[{Length@FactorInteger[#[[2]] + 1], #[[2]] + 1} &, {2, 209}, (#1[[1]] != 4 || #2[[1]] != 4 || #3[[1]] != 4 || #4[[1]] != 4) &, 4] 运行时间:1.36 sec *********************************************************************** 然后看到直接有内部函数PrimeNu可以算不同质数因子的个数,就改了下: NestWhile[{PrimeNu[#[[2]] + 1], #[[2]] + 1} &, {2, 209}, (#1[[1]] != 4 || #2[[1]] != 4 || #3[[1]] != 4 || #4[[1]] != 4) &, 4] 结果运行时间变为: 3.9 sec, 慢了3倍。 Trace看了一下,慢的原因是 PrimeNu会有一系列的判断过程,不像Length@FactorInteger这般直接。 *************************************************************************** 然后在这道题的Forum上看到有人贴出下面NestWhile版本: NestWhile[# + 1 &, 209, ! (And @@ Thread[4 == Length /@ FactorInteger[# + {0, 1, 2, 3}]]) &] 运行时间是: 3.32 sec 推测这个慢的原因是,相比我自己写的Nest程序,每一次Nest运算, 后面的判断都要进行较多的计算 这原因是从下面的改写得到的: NestWhile[# + 1 &, 209, ! ({4, 4, 4, 4} === Length /@ FactorInteger[# + {0, 1, 2, 3}]) &] 后面的判断减少了计算,运行时间提高到2.85sec ******************************************************************************** 但 这里最快的 却是 While循环: (a = 210; While[Length@FactorInteger[a] != 4 || Length@FactorInteger[a + 1] != 4 || Length@FactorInteger[a + 2] != 4 || Length@FactorInteger[a + 3] != 4, a++]; a) 运行时间:0.81 sec ********************************************************************************* For循环最慢: (For[i = 1, Not[{4, 4, 4, 4} === Length /@ FactorInteger[i + {0, 1, 2, 3}]], i++]; i) 2.76 sec 如果Length/@FactorInteger替换成PrimeNu,时间突增到13s。足见,并不是任何内部函数都比自己编的函数要有效率的。。 。记得之前 @xzcyr 好像也发过一个帖子,是说怎么让NestWhile快过While,现在找不到了~ 对于这个具体问题,MMA函数式编程有什么改善的方法,使得其运行效率比单纯While循环快?
MMA内置函数重造 最近在看Power Programming with Mathematica: The kernel,因为这本书里面的MMA版本较老,所以现在版本里的很多函数,再那里都还没有,因为后面的练习题有一些是函数重造的练习题。编写了一点,感觉MMA内置函数重造也是一个不错的熟悉、练习MMA编程的过程,尽管有的时候自己编写的函数相比内置函数,运行效率差距不是一点点。函数重造的一个要求就是要能实现内置函数的全部功能,后面抛砖引玉编写了两个: 1. 首先是Extract,Extract有两个功能, 一个就是取出元素Extract[expr,{list1,list2,...}] 另一个是在取出元素之后,在其计算之前加上函数头h,即Extract[expr,list,h] 重造函数及其功能实现如下图:2,第二个是NumericQ的重造 最简单的办法就是NumberQ[N[expr]] 另外还有一个递归的算法,思想就是数字或者MMA常数比如Pi则是数字量,或者函数头具有NumericFunction属性且其所有参数都是数字或MMA常数,则是数字量。算法如下: myNumericQ1[x_, appendx___] := If[AtomQ[x], True, MemberQ[Attributes[Evaluate@Head[x]], NumericFunction]] && If[AtomQ[x], NumberQ[x] || MemberQ[Attributes[x], Constant], myNumericQ[Sequence @@ x]] && If[{appendx} === {}, True, myNumericQ[Sequence @@ appendx]] 递归算法就是有一个不足,有递归限制,然后运行效率 不是很高 另外一个改进算法,就是提取出表达式的所有函数头以及参数,Union去除重复的,然后分别检测函数头跟参数是否满足上述条件,对于Atom,则单独处理: myNumericQ[expr_?AtomQ] := NumberQ[expr] || MemberQ[Attributes[expr], Constant] myNumericQ[expr_] := With[{all = Union[Select[Level[expr, Infinity, Heads -> True], AtomQ]], leaf = Union[Select[Level[expr, Infinity], AtomQ]]}, And @@ Flatten@{(NumberQ[#] || MemberQ[Attributes[#], Constant]) & /@ leaf, MemberQ[Attributes[#], NumericFunction] & /@ Complement[all, leaf]}] 这些就随便玩玩,欢迎交流,有兴趣的朋友也可以贴上自己重构的函数,对于这两个函数,有改进的算法也欢迎交流运行情况来看,myNumericQ还可以,这么一个复杂的式子也可以检测出来,但是myNumericQ1递归的定义方式就有点问题了,t这么一个复杂的表达式就无法判断了,对于简单的式子还可以,问题出在哪里,有空了再检查检查,而至于NumberQ[N[expr]]的重造方式,只要计算不超过$MaxNumber,都是可行的,这也是NumberQ[N[expr]]的弱点,要判断,必须先计算
【转载】关于Mathematica提速的10点技巧 看到有吧友求MMA编程提速技巧,就想到这篇文章了。这篇是Wolfram Blog上的一篇文章http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fblog.wolfram.com%2F2011%2F12%2F07%2F10-tips-for-writing-fast-mathematica-code%2F&urlrefer=06da9ed0ad59cb222158d613aa73dad3,之后在网上看到有人将之翻译过来了,就转载过来给各位吧友看看吧~此翻译文章的原址是http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fwww.cnblogs.com%2Fmymma%2Farchive%2F2012%2F08%2F27%2F2659007.html&urlrefer=9db8e15011db0a250ddcb23753252902 当人们跟我抱怨说Mathematica不够快时,我一般会叫他们去仔细瞧瞧那些令人恼怒的代码.跑得慢的原因通常不是Mathematica的性能问题,而是使用方式不太合适.我想我应该分享一些我在优化Mathematica代码时使用的技巧. 1.如果可能话,使用机器精度数并尽量提早使用 如我所见,那些漫不经心的程序员所编写的缓慢的代码的一个共同特点是,一下子让Mathematica考虑到了太多的琐事而忽略自己的实际需求.不必要的附加计算是导致代码缓慢的最普遍原因. 大部分的数值计算软件中没有这些附加计算,1/3和0.33333333333333被认为是相等的.这些附加计算在你遇到一些复杂难缠的计算时是很有用的.但是在大部分的计算任务中,浮点运算的机器精度已经足够好,更重要的是,计算速度更快.任何小数位数小于16位的十进制输入都会自动被Mathematica按机器精度处理,所以,如何你的计算原则是速度优先,那么就尽可能使用机器精度的小数而不是精确形式(例如1/3).这里有一个简单的例子说明直接使用浮点数进行机器精度的运算会比先用绝对精确形式计算然后转换为小数的方法快50倍左右.当然,我们这个例子里得到的结果是相同的.
【关于贴吧求助贴的一点建议,大家可以参考参考】 这吧有带头大哥在了,最近果然是越来越热闹了,也看到了很多以前没见过的朋友来这里求助问题。但是,很多朋友的求助帖,我看了,怎么说了,就一个感觉,是真的来求助吗? 求助帖,最忌讳的就是一上来就直接求某某大神帮忙做个题目或者编个代码什么的,自己啥都没做就上来,想不劳而获。这种帖子,一般都不会有人理。而特别是一些很简单的问题,明明查看帮助文档就能自己解决的,也来浪费时间求助。以前这个贴吧会有这种帖子,最近进入正轨了,好像都没怎么看到。风气越来越好了! 大多数朋友来求助,基本上都是自己做过一些工作,碰到问题了,然后来贴吧寻求帮助。大家也可以都多讨论讨论,集思广益,这对于交流学习是非常有帮助的。 但现在有个问题就是,鉴于贴吧功能的有限,尤其是排版功能的极度薄弱,很多人就直接将自己MMA里运行的代码以及结果截个图上传上来,然后来询问什么问题。当然如果代码短,那还好,我们自己敲敲键盘也就几十秒的时间,但是如果是一大段非常长的代码,还是有很多数学函数的,这个你让贴吧里的其他朋友再自己敲键盘,实在不现实,也没有人会这么做。毕竟,每个人都有自己的事情,能来解答你的问题已是很热心的人了。如果还要他自己敲代码,我觉得,这是不好的。 所以对于求助帖,我提下面几点建议,或者说一个格式,这样方便吧里朋友应助: 1. 首先,必须说明求助问题的背景。如果是有关Mathematica本身的,那不用介绍,没什么问题。但如果是涉及的专业的问题,那背景必须要介绍,不然别人都不知道怎么帮助你。你可以说说你的问题,以及想要达到的结果,或者一段代码是用来干嘛的,或者某个概念的解释。当然,最好的是,能够自己分析,将自己想要达到的结果转化为Mathematica问题。 举个例子,比如来求助怎样用Mathmatica画面心立方体晶体结构,然后罗列了自己的一些代码。但是不是每个人都知道什么是面心立方体晶体结构的。你可以将这个转化为:怎样根据一个空间点阵中点的坐标,在Mathematica中画出这些点。因为,空间点阵中点的坐标是你理解知道的,而在Mathematica中画出这些点是你所缺乏的,但却是这个贴吧里很多朋友所知道的。 这样的求助,才是有效率的!尽量少涉及专业的东西,一定的涉及,那也要介绍精彩背景。 2. 其次,必须是得自己尝试过。任何自己一点都没有尝试的求助是没有意义的,对于求助者自己,学不到什么东西,因为你没有尝试,就没有自己的想法;没有自己的想法,那么,别人的答案等于0,无论别人是对还是错,对没有想法的人来说,都是无意义的。 而这个尝试,不一定就是说,你得编出一段代码出来。任何小的尝试,你都可以写进自己求助贴中已做工作的部分。比如,你想要达到某个结果,自己查阅了某个函数,但是这个函数不能完全实现自己的结果。这个尝试之后,再来求助,才会有收获。 总之,不能是啥都没做,就来求助。 3. 如果是自己尝试过编写了代码,那么求助的时候,最好将代码运行时碰到的问题或者跟自己的预期的差别说清楚,这样别人才有的放矢。 这里的一个建议是,能找到自己预期的结果,最好也贴上来,文字或者图片格式都行。而对于代码运行过程中运行的问题【就是运行中出现的橙色字的警告信息或者错误信息】,可以直接就截图传上来,因为这些信息中有时会涉及到一些函数的表达,直接复制上来贴到贴吧里,就是Mathematica的输入形式,看起来比较困难,特别是一些特殊符号和特殊的函数形式。 4. 贴上自己编写的代码【如果有的话】。这里,你可以也截图传上来,其理由同上,毕竟Mathematica里的二维输入以及函数形式看起来舒服。但这不是必须的。必须的,就是: 【直接复制你的Mathematica代码到贴吧里。虽然复制过来是MMA的输入形式,但是应助者再拷贝到MMA中时,就又是MMA的标准形式了。而这样做的最主要的目的是给人方便。不要你自己编写的一段长长的代码,然后截个图上来,问吧里朋友这段代码有什么问题。要知道,很多时候,不实际运行一下,一时半会儿是看不出问题所在的。而这么长的代码,要让应助者自己敲键盘,我想,很多人都不乐意的】 所以为了自己的求助问题的效率,也为了给人方便,就贴上自己的代码吧。就一个Ctrl+C和Ctrl+V的时间,还不到5秒中的时间。。。 建议就这些吧,只是给大家来求助问题时参考参考,怎样提问求助才能高效快速的得到别人的帮助。^_^ 就说这么多了,码这些字还真不容易。。。。。
【音乐分享】两张轻音乐专辑【France Ellul的spirits系列】 关于France Ellul,不了解的人可以°娘之,这里简单说一下,FRANCE ELLUL是一位全才音乐家,是著名竖琴家。他创作了Spirits系列三部曲,Spirits of the Sea,Spirits of the Moon和Spirits of the Forest,这三张专辑都是非常空灵安静的,意境很悠远。欲详细了解这三张专辑,也请°娘之,建议谷哥之。好了,言归正传,上音乐。 下载地址: 115网盘 -Spirits of the Moon【APE无损】 http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2F115.com%2Ffile%2Fbecq27n3&urlrefer=5fd4e5f128d071c061bab0fb03f2c8b7 -Spirits of the Forest【320Kb MP3】http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2F115.com%2Ffile%2Fe78dqt5q&urlrefer=1b1515eb7c7f153e24dd171adaab53d4 QQ文件中转站 -Spirits of the Moon【APE无损】http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fmail.qq.com%2Fcgi-bin%2FftnExs_download%3Fk%3D5465306437bfd78a3e26b2444533544a0f5d0850555651561a510101071e520404511d0657555248535104050755535352010250631d662345045e07061d23095b105c4a4e1d3d36470c420d1740480a514b440c061d2b0a580b6d4ab49b484b194b420511335b%26code%3D7e0dc3fe%26t%3Dexs_ftn_download&urlrefer=016d911f435b24d84a02024b495e846a -Spirits of the Forest【320Kb MP3】http://tieba.baidu.com/mo/q/checkurl?url=http%3A%2F%2Fmail.qq.com%2Fcgi-bin%2FftnExs_download%3Fk%3D5438666577f68bca397be4451365021d56015750565756041d5b5f5305480400065c4b5c5606551f060b57545451020301010354354a307442590806504b755e5c4d0a4b134b775d4659080b500b1e1f1e6335155c175946431629031b31581c1e1648175417300f%26code%3D08fe5e02%26t%3Dexs_ftn_download&urlrefer=01a5a2c0a8b1edfd8c5d6e61fb562e5c 要是没有115网盘的朋友或者QQ中转站不能下载了,后面留邮箱,最好留QQ邮箱,这样我可以以QQ超大附件发给你们。QQ邮箱对QQ邮箱发送超大附件相对要好些,发到别的邮箱有可能被拒收或归入广告邮件。 不过很遗憾的是,Spirits of the Sea这张专辑在网上还没有找到下载的,大伙儿要有心,也找找看看,找到了不忘分享啊! 最后的最后,我再长传几首这两张专辑里的单曲,大家可以先听听,感觉符合自己的品味了再下载也不迟,不然总共300多M的音乐,网络不给力的话下载也是需要好长时间的。 Spirits of the forest 里的Elder And Elm Spirits of the forest 里的The Forest Awakes Spirits of the Moon 里的Moonchild
1 下一页