2013-06-20 85 views
1

我有一個使用2個持久變量的函數。功能輸入爲gcb,用於實際的simulink塊。我想在各個塊上使用該函數,因此我希望使用引用塊名稱的名稱聲明持久變量。動態持久變量

function testBlock(blk) 
    blkName = get_param(blk, 'name') 
    persistent blkValues % this works for one block 
    % but I want something like this 
    persistent eval([blkName 'Values']) % doesn't work 
    ... 
end 
+1

你有沒有考慮過使用塊上的'UserData'字段?這將是一個更強大的解決方案。 – macduff

+0

@macduff所以我必須做一些像'set_param(gcb,'UserData',[blkName'Values'])''? –

回答

1

如果你想要做的只是存儲塊的名稱,那麼是的。如果你想要一些數據和描述性的名字,我想一個結構的工作,如:

data = struct([blkName 'Values'],[]); 
set_param(gcb,'UserData',data); 

然後,當你得到你所使用的數據,

ud = get_param(gcb,'UserData'); 
% ud.([blkName 'Values']) <- your data 

或者你可以使用全球appdata存儲:

setappdata(0,[blkName 'Values'],data); 

data = getappdata(0,[blkName 'Values']); 

或者你也可以在運行時重寫函數創建一個變量,你想要的名字,,但我已經看到了類似的事情。 HTH!

編輯UserData是我用過很多次的對話回調的方法,所以我有信心它會成功,但是我可能無法完全理解你的應用程序。 :-)

編輯 如果你需要的數據每次加載模型時持續下去,則必須在UserDataPersistent參數設置爲'on'。這是一個惱人的,但可以理解的必要特性,可以選擇是否忘記模型關閉和刷新內存後發生的事情。由於這是你的用例,所以在m腳本中的persistent變量將不起作用,因爲當Matlab終止時它們被遺忘。我相信你需要像使用setpref一樣使它在Matlab會話之間保持不變。

+0

我不確定這是否會與我的實際功能一起工作。我需要持久變量,因爲腳本在掩碼的對話框回調中。所以持久變量允許在調用函數之間保持值。 –

+0

我用你的建議解決方案。我發現我別無選擇,只能使用'set_param(gcb,'UseDataPersistent','on')'。如果我不使用它,關閉並重新打開Simulink模型時UserData將丟失。也許我還在做錯事。 –

+0

我想到了,我會修改答案。 – macduff

1

帶持久數據的函數並在不同地點重用函數以實現不同目的是互斥的。你不能這樣做。你必須把你的數據放在函數之外。這樣做的一些方法是,a)已經建議的UserData字段,b)用於例如一個墊子文件,或c)像地圖一樣的容器,根據輸入查找。