2012-02-28 21 views
0

我正在尋找一種方式來生成和繪製數據而不存儲實際數據。作爲基本示例:ListPlot是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, l++, 
    AppendTo[list, {k + ndiag*j, l + ndiag*j}] 
    ]]]] 
ListPlot[list] 

事實上,這需要相當長的時間。大概是因爲不斷添加到列表中必須存儲。它開始的很快,但隨着名單變得越來越慢,速度變慢了。我真的只想看到填充的模式。有沒有辦法避免存儲列表,並只添加一個點到劇情?它沒有必要顯示它,因爲它已經更新,當它完成時一個圖是好的。編輯:我確實發現收割和母豬,這絕對幫助噸與速度問題,但出於純粹的好奇心,我仍然想知道如何避免存儲數據(除了情節)。

回答

2

在你開始用動畫圖和類似的東西摔跤之前,我建議你重新編寫生成你的數據集的線。您已經使用Mathematica編寫了似乎是C程序的內容,並選擇了創建數據列表的最慢方法。

我沒有數學這臺機器所以沒有測試以下,但沿線的聲明:

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}] 

會快得多運行(我的意思是,要快得多)比你的窩循環。你會發現Table執行的輸出需要一些Flatten -ing。順帶一提,我還注意到,在Mathematica中使用1作爲索引基數比使用0更自然。

我相信你是正確的,以確定你使用0​​作爲罪魁禍首使你的代碼慢。這是一個已經被覆蓋上SO幾次的話題,我認爲數學是你每次Append重新分配內存添加到現有列表

我認爲Table命令將運行速度不夠快,你的願望,已經產生積一步一步地蒸發。但如果它不是,你可以看看Animate或其堂兄弟。但是,如果你不小心,你可能會發現你在每個階段都會記住數據點的列表,所以不是有一個表有N個項目,而是你會發現一系列大小爲1, 2, 3, ..., N的表格,這些表格不會太多的優化。

我認爲,爲了節省內存,您一次一個添加點到一個圖的想法是錯誤的 - 在哪裏(和如何)將圖表的信息存儲,直到您顯示它?看一看簡單圖形的FullForm

如果您仍然關心內存使用情況,則可以使用您在完成該變量後創建的變量,或者簡單地將ListPlot[]換成Table語句,在這種情況下表格將不會有名稱,當Mathematica得到它時收集。我不相信Mathematica在垃圾收集方面非常出色,但我也很少擔心。

+0

其實我的意思是我不要* *不需要動畫劇情。該表是一個很好的建議。 Reap和Sow使得實際的數據生成變得微不足道,所以現在速度並不糟糕。我希望避免存儲數據可能會被誤解。我很好奇,如果我可以避免兩次存儲。目前,我最終列出了一系列數據點和一張具有相同數據點列表的圖形。我想基本上創建一個單一的情節,然後能夠將新的數據直接納入到情節。 事實上,它實際上是C++代碼。我正在繪製矩陣的填充結構,以便我可以看到它的行爲是否正確。 – Adam 2012-02-28 11:15:15

1

在下面的截圖中做數據和繪圖看起來像你想要得到什麼?

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] & 

產生數據

data

ListPlot[list] 

enter image description here