我正在尝试使用Mathematica分析一些原始数据。我希望能够使用Manipulate和ListLinePlot动态显示我感兴趣的数据范围,但绘图速度非常慢。如何加快速度?
以下是一些额外的细节。一个外部文本文件存储原始数据:第一列是时间戳,第二、三、四列是数据读数,例如:
以下是一些额外的细节。一个外部文本文件存储原始数据:第一列是时间戳,第二、三、四列是数据读数,例如:
1309555993069, -2.369941, 6.129157, 6.823794
1309555993122, -2.260978, 6.170018, 7.014479
1309555993183, -2.070293, 6.129157, 6.823794
1309555993242, -1.988571, 6.238119, 7.123442
一个数据文件最多包含2·106行。例如,要显示第二列,我使用以下代码:
x = Import["path/to/datafile"];
ListLinePlot[x[[All, {1, 2}]]]
这个操作的执行时间太长了。为了显示一个变量数据范围,我尝试使用了Manipulate
:
Manipulate[ListLinePlot[Take[x, numrows][[All, {1, 2}]]], {numrows, 1, Length[x]}]
这个指令可以工作,但是当我尝试显示超过几千行的数据时,它会变得非常缓慢。如何加速它呢?
以下是一些额外的细节:
- MATLAB 在同一台电脑上以几乎瞬间的速度显示相同数量的数据,因此原始数据大小不应该是问题。
- 我已经尝试关闭图形抗锯齿,但它并没有影响渲染速度。
- 使用
DataRange
来避免使用Take
没有帮助。 - 使用
MaxPlotPoints
会使图形扭曲得太厉害,无法使用。 - 在
Manipulate
中不使用Take
没有帮助。 - 渲染似乎花费了大量时间。运行
Timing[ListLinePlot[Take[x,100000][[All, {1, 2}]]]]
返回0.33
:这意味着单独评估Take
几乎是瞬间完成的,是绘图渲染导致了一切变慢。 - 我正在使用 Ubuntu Linux 11.10 上的 Mathematica,使用 fglrx 驱动程序。强制 Mathematica 使用 mesa 驱动程序没有帮助。
有什么提示吗?