谁能在代码和计算时间上改进一下这个MMA程序?
mathematica吧
全部回复
仅看楼主
level 11
iangie_明月 楼主
我的目的是要把37个 2*20000 的二维数组组合成一个三维数组并用ListDensityPlot画出图来.
In[19]:= ClearAll["`*"]
In[20]:= data = ReadList[#, {Number, Number, Number}] & /@ FileNames["C:\\insitu\\dalian\\dalian1_00*.xye"]
(*读入37个xye格式的文件,每个大概有850kb, 所以一共是20多Mb, 有点慢*)
In[21]:= For[i = 1, i < 38, i++, {theta2[i], intensity[i], error[i]} = Transpose[data[[i]]]];
(*把每个xye数据转置分成角度列,强度列和误差列, 注意这37个数据的长度还不一样*)
In[22]:= For[i = 1, i < 38, i++, XYZ[i] = Transpose[{Take[theta2[i], 19904], Table[i, {19904}],
Take[intensity[i], 19904]}]];
(*舍去误差列数据, 把数据转置回来中间加上加上数据编号i, 只取前面19904个数据*)
In[24]:= XYZ =
Join[XYZ[1], XYZ[2], XYZ[3], XYZ[4], XYZ[5], XYZ[6], XYZ[7], XYZ[8],
XYZ[9], XYZ[10], XYZ[11], XYZ[12], XYZ[13], XYZ[14], XYZ[15],
XYZ[16], XYZ[17], XYZ[18], XYZ[19], XYZ[20], XYZ[21], XYZ[22],
XYZ[23], XYZ[24], XYZ[25], XYZ[26], XYZ[27], XYZ[28], XYZ[29],
XYZ[30], XYZ[31], XYZ[32], XYZ[33], XYZ[34], XYZ[35], XYZ[36],
XYZ[37]]
(*把37数据合并到一起, 请教这个应该怎么写才不用这么累?*)
In[25]:= ListDensityPlot[XYZ, InterpolationOrder -> 0,
PerformanceGoal -> "Speed"]
(*我已经用了最低要求了, 但是画这个图用了一下午时间-_-|||*)
---------------------
所以请问:
代码怎么写才能简单点? 特别是In[24]怎么写才方便一点?
In[25]的计算速度耗时大约6个小时...................是我的数据太多了吗?也就是20000*2*37个数据而已啊......
大神们请指点!!!
2013年12月18日 05点12分 1
level 9
in24 不能直接用Table之类的?
Join @@ Table[XYZ[i], {i, 1, 37}]
另外那么多For它能快吗>_>
2013年12月18日 06点12分 2
没看清貌似不是for的问题<_<
2013年12月18日 06点12分
回复 asd321fgh678 :其他几步都很快, 只有In[25]耗时一下午.......
2013年12月18日 15点12分
吧务
level 12
In24可以用Join @@ (XYZ /@ Range@37)
很奇怪In20都用了/@,为什么后面却充满了For和Table?
2013年12月18日 13点12分 3
前面第一句是网上抄的, 后面自己写的全是吃以前C语言老本... 请问你知道为什么In[25]那么慢吗?
2013年12月19日 07点12分
吧务
level 15
……没啥特别的,就是点太多了。上一次有类似的讨论还是这里:
https://tieba.baidu.com/p/2039076100
20000*2*37已经太多太多了好伐,你随便DensityPlot一副图加上Mesh -> All看看默认情况下Mathematica才用多少个点。
2013年12月21日 04点12分 4
谢谢, 我已经在精简数据了.....
2013年12月22日 06点12分
吧务
level 9
一定要用ListDensityPlot吗?这个函数的速度几乎是同类函数里面最慢的了,用ArrayPlot或Image是比这个快得多的
2013年12月22日 09点12分 5
我要画的不是Array, 而是{{x1,y1,Intensity1},{x2,y2,Intensity2},....{X2000,y2000,Intensity2000}}的数据, xi,yi是各不相同的位置,Intensityi是强度, 你说这两个函数不能画.
2013年12月22日 10点12分
level 11
iangie_明月 楼主
终于精简好了
2013年12月22日 10点12分 6
level 11
iangie_明月 楼主
C语言面向过程的编程方法真是伤不起啊..........
2013年12月23日 02点12分 8
level 11
iangie_明月 楼主
数据精简常用的方法: 插值
For[i = 1, i < 38, i++, {f = Interpolation[XY[i]], XYgrid[i] = Table[f[t], {t, 15, 80, 0.01}]}]
array = Table[XYgrid[i], {i, 1, 37}];
ListDensityPlot[Log[array]]
用了插值法把数据点的xy坐标对齐以后用ListDensityPlot再画速度快多了~~偶也~~妈妈再也不用担心我的学习了.........
2013年12月24日 05点12分 9
其实啊……算了,反正你都写好了。
2013年12月28日 04点12分
回复 xzcyr :别介, 请继续说下去啊.....
2013年12月28日 11点12分
回复 iangie_明月 :其实也就是老生常谈,改用Map和Apply更简单更快之类的,还有就是你的f和XYgrid是顺序计算的,可你却用列表把它们括起来了,这有一种潜在的问题,那就是,逻辑上列表的两个元素是同时计算的,虽然目前来看好像实际实现的时候都是顺序进行,但是万一哪天这种计算变成了自动并行的嘛…
2013年12月28日 12点12分
1