Wolfram mathematica ListPlot是Mathematica,不存储列表

Wolfram mathematica ListPlot是Mathematica,不存储列表,wolfram-mathematica,Wolfram Mathematica,我正在寻找一种在不存储实际数据的情况下生成和绘制数据的方法。作为一个基本示例: list = {}; idim = 40; ndiag = 100; grpSize = 4; m = idim/grpSize; For[rank = 0, rank < grpSize, rank++, For[j = rank*m, j < (rank + 1)*m, j++, For[k = 0, k < ndiag, k++, For[l = 0, l < ndiag,

我正在寻找一种在不存储实际数据的情况下生成和绘制数据的方法。作为一个基本示例:

list = {}; idim = 40; ndiag = 100; grpSize = 4; m = idim/grpSize;
For[rank = 0, rank < grpSize, rank++,
 For[j = rank*m, j < (rank + 1)*m, j++,
  For[k = 0, k < ndiag, k++,
   For[l = 0, l < ndiag, l++,
    AppendTo[list, {k + ndiag*j, l + ndiag*j}]
    ]]]]
ListPlot[list]
list={};idim=40;ndiag=100;grpSize=4;m=idim/grpSize;
对于[rank=0,rank

事实上,这需要相当长的时间。大概是因为必须存储的列表不断增加。它开始很快,但随着列表变长,它会变慢。我真的只想看到填充的模式。有没有办法避免存储列表,只需在绘图中一次添加一个点?它不必在更新时显示,完成后一个绘图就可以了。编辑:我确实发现了收割和播种,这无疑对解决速度问题有很大帮助,但出于好奇,我仍然想知道如何避免存储数据(除了作为绘图)。在开始与动画绘图等进行斗争之前,我建议您重新编写生成数据集的行。您已经使用Mathematica编写了看起来像是C程序的程序,并且选择了可能是创建数据列表最慢的方法

我没有在这台机器上安装Mathematica,因此没有测试以下内容,但有一个大致如下的陈述:

tabl = Table[{k + ndiag*j, l + ndiag*j}, {l,0,ndiag-1},{k,0,ndiag-1},{j,rank*m,(rank+1)*m},{rank,0,grpSize-1}]
将比您的循环嵌套运行得更快(我的意思是,更快)。您会发现
的输出执行需要一些
展平
-ing。顺便提一下,我还注意到,在Mathematica中,使用1作为索引基比使用0更自然

我相信您正确地将
Append
的使用视为使代码变慢的罪魁祸首。这是一个已经讨论过好几次的主题,因此,我认为Mathematica在每次向现有列表追加
时都在重新分配内存

我认为
Table
命令将运行得足够快,以至于您逐步生成绘图的愿望将烟消云散。但如果没有,你可以看看
动画
或它的一个近亲。但是,如果不小心,您可能会发现在每个阶段都会为数据点列表占用内存,因此您会发现自己拥有一系列大小为
1,2,3,…,N
的表,而不是一个包含N个项目的表,这并不是一个多大的优化

我认为,您为节省内存而一次向绘图添加一个点的想法是错误的——在显示之前,绘图信息将存储在何处(以及如何存储)?查看一个简单图形的
完整格式


如果您仍然担心内存使用情况,那么要么
删除
完成后创建的变量,要么简单地将
列表图[]
环绕在
语句周围,在这种情况下,该表将没有名称,因此当Mathematica对其进行处理时,它将被垃圾收集。我不相信Mathematica在垃圾收集方面非常出色,但我也很少担心它。

在您开始尝试动画情节等之前,我建议您重新编写生成数据集的行。您已经使用Mathematica编写了看起来像是C程序的程序,并且选择了可能是创建数据列表最慢的方法

我没有在这台机器上安装Mathematica,因此没有测试以下内容,但有一个大致如下的陈述:

tabl = Table[{k + ndiag*j, l + ndiag*j}, {l,0,ndiag-1},{k,0,ndiag-1},{j,rank*m,(rank+1)*m},{rank,0,grpSize-1}]
将比您的循环嵌套运行得更快(我的意思是,更快)。您会发现
的输出执行需要一些
展平
-ing。顺便提一下,我还注意到,在Mathematica中,使用1作为索引基比使用0更自然

我相信您正确地将
Append
的使用视为使代码变慢的罪魁祸首。这是一个已经讨论过好几次的主题,因此,我认为Mathematica在每次向现有列表追加
时都在重新分配内存

我认为
Table
命令将运行得足够快,以至于您逐步生成绘图的愿望将烟消云散。但如果没有,你可以看看
动画
或它的一个近亲。但是,如果不小心,您可能会发现在每个阶段都会为数据点列表占用内存,因此您会发现自己拥有一系列大小为
1,2,3,…,N
的表,而不是一个包含N个项目的表,这并不是一个多大的优化

我认为,您为节省内存而一次向绘图添加一个点的想法是错误的——在显示之前,绘图信息将存储在何处(以及如何存储)?查看一个简单图形的
完整格式


如果您仍然担心内存使用情况,那么要么
删除
完成后创建的变量,要么简单地将
列表图[]
环绕在
语句周围,在这种情况下,该表将没有名称,因此当Mathematica对其进行处理时,它将被垃圾收集。我不相信Mathematica在垃圾收集方面非常出色,但我也很少担心它。

下面截图中的数据和绘图是否与您想要的一样

   list = Table[Table[Table[{k + ndiag j, l + ndiag j}, {k, 0, ndiag}, {l, 0, ndiag}], 
   {j, rank m , (rank + 1) m}], 
   {rank, 0, grpSize}] //  Flatten[#, 3] &
生成数据

给予


下面截图中的数据和绘图是否与您想要获得的内容类似

   list = Table[Table[Table[{k + ndiag j, l + ndiag j}, {k, 0, ndiag}, {l, 0, ndiag}], 
   {j, rank m , (rank + 1) m}], 
   {rank, 0, grpSize}] //  Flatten[#, 3] &
生成数据

给予

实际上,我的意思是我不需要动画情节。这张桌子是个好建议。收割和播种使得数据的实际生成变得微不足道,所以现在速度还不错。我希望避免存储数据的想法可能被误解了。我很好奇我是否能避免储存两次。