2014-09-18 95 views
3

這是一個通用算法問題,但我的主要環境是Matlab。避免用相同的參數重複調用模擬/函數

我有一個函數

出= F(ARG1,ARG2 ,, ......)

這需要很長的時間來執行,而且很昂貴來計算(即簇時間)。一個給定的參數argn可以是一個字符串,整數,向量,甚至一個函數句柄

因此,我想避免調用相同的參數值f(args)。在我的程序內部,這可能以程序員不一定可以控制的方式發生。

所以,我想爲args的每個可能的值調用f()一次,並將結果保存到磁盤。然後,每當它被下一次調用時,檢查當前是否有這些參數值的結果。如果是這樣,我會從磁盤加載它。

我目前的想法是創建一個單元格變量,每個函數調用一行。在第一列出來。在第2欄中:N是argn的值,並檢查每個單獨的等價性。

由於參數的變量類型不同,我該如何去做這件事?

有更好的算法嗎?

更普遍的是,人們如何處理將模擬結果保存到磁盤並存儲元數據? (比填鴨式的一切到一個文件名等!)

+3

一句話,你正試圖實現記憶。 – Jommy 2014-09-18 16:07:41

+0

謝謝。一個關鍵字幫助我的搜索巨大! – 2014-09-18 16:52:36

回答

1

您可以實現類似這樣的功能:

function result = myfun(input) 

persistent cache 

if isempty(cache) 
    cachedInputs = []; 
    cachedOutputs = []; 
    cache = {cachedInputs, cachedOutputs}; 
end 

[isCached, idx] = ismember(input, cache{1}); 

if isCached 
    result = cache{2}(idx); 
else 
    result = doHardThingOnCluster(input); 
    cache{1}(end+1) = input; 
    cache{2}(end+1) = result; 
end 

這個簡單的例子假設你的投入和產出是可以存儲在標量數量數組。如果你不得不處理字符串,或者更復雜的話,你可以使用單元數組來進行緩存而不是數組。或者事實上,也許containers.Map可能會更好。或者,如果您必須緩存真正巨大的結果,則最好將其保存到文件並緩存文件名,然後如果發現文件已緩存,則加載該文件。

希望有幫助!