2013-03-15 58 views
2

我只是想知道是否有一個乾淨的方式來存儲矩陣後每次迭代不同的名稱?我希望能夠以不同的名稱存儲每個矩陣(uMatrix),具體取決於我在Sim1,Sim2,...等等上的模擬。例如,在第一次運行後Sim1 = uMatrix,然後Sim2 = uMatrix第二次通過。所以每次我可以爲每個不同的仿真存儲不同的uMatrix。MATLAB每次迭代更改矩陣的名稱

任何幫助將不勝感激,並抱歉,如果這原來是一個愚蠢的問題。同樣在此代碼是否可以被清理的指針會太

代碼我使用下面

d = 2;    
kij = [1,1]; 
uMatrix = []; 
RLABEL=[]; 
SimNum = 2; 

for i =1:SimNum 
    Sim = ['Sim',num2str(i)] %Simulation number 
    for j=1:d 
     RLABEL = [RLABEL 'Row','',num2str(j) ' ']; 
     Px = rand; 
     var = (5/12)*d*sum(kij); 
     invLam = sqrt(var); 
     u(j) = ((log(1-Px))*-invLam)+kij(1,j); 
     uMatrix(j,1) = j; 
     uMatrix(j,2) = u(j); 
     uMatrix(j,3) = kij(1,j); 
     uMatrix(j,4) = Px; 
     uMatrix(j,5) = invLam; 
     uMatrix(j,6) = var; 
    end 
    printmat(uMatrix,'Results',RLABEL,'SECTION u kij P(Tij<u) 1/Lambda Var') 
end 

回答

6

確實有太多的選擇。去都將數據描述到,並獲得了其中的一些方法對我們的數據:在變量名

編碼

我真的,真的不喜歡這種方法,但它似乎是你具體是什麼要求。爲了uMatrix保存爲一個變量Sim5(第五運行之後),添加以下代碼在循環的末尾:

eval([Sim ' = uMatrix;']); %Where the variable "Sim" contains a string like 'Sim5' 

要訪問數據

listOfStoredDataNames = who('Sim*') 
someStoredDataItem = eval(listOfStoredDataNames {1}) %Ugghh 
%or of you know the name already 
someStoredDataItem = Sim1; 

現在,請不要這樣做。讓我試着說服你,有更好的方法。

使用結構

要做到同樣的事情,使用simResults

simResults.(Sim) = uMatrix; 

稱爲(例如)的結構,甚至更好

simResults.(genvarname(Sim)) = uMatrix; 

要訪問數據

listOfStoredDataNames = fieldnames(simResults) 
someStoredDataItem = simResults.(listOfStoredDataNames{1}) 
%or of you know the name already 
someStoredDataItem = simResults.Sim1 

這樣可以避免始終存在問題的eval語句,更重要的是使附加代碼更容易編寫。例如,您可以輕鬆地將所有simResults轉換爲進一步處理的功能。

使用地圖

使用地圖做同樣的存儲,首先初始化地圖

simResults = containers.Map('keyType','char','valueType','any'); 

然後在每次迭代添加值到地圖

simResults(Sim) = uMatrix; 

要訪問數據

listOfStoredDataNames = simResults.keys 
someStoredDataItem = simResults(listOfStoredDataNames{1}) 
%or of you know the name already 
someStoredDataItem = simResults('Sim1') 

地圖在可用於名稱的字符串中稍微靈活一些,如果您感覺舒適,它們可能是更好的解決方案。

使用的單元陣列

對於簡單的,結果的無無義存儲

simResults{i} = uMatrix; 

要訪問數據

listOfStoredDataNames = {}; %Names are Not available using this method 
someStoredDataItem = simResults{1} 

或者,使用輕微的電平的nonesense

simResults{i,1} = Sim;  %Store the name in column 1 
simResults{i,2} = uMatrix; %Store the result in column 2 

要訪問數據

listOfStoredDataNames = simResults(:,1) 
someStoredDataItem = simResults{1,2} 
+0

當我寫這個,感覺很熟悉。另請參閱:http://stackoverflow.com/a/14130366/931379進行類似的討論。 – Pursuit 2013-03-15 17:53:59

+0

感謝您的意見。我很樂意接受你的建議,而不是使用EVAL功能。我使用Strucutre發現的唯一問題是MATLAB只是返回Sim1:[2x6 double] Sim2:[2x6 double],如果我想回頭查看矩陣的內容,現在有沒有辦法訪問這些數據對於Sim1或Sim2是? – Adam 2013-03-15 18:22:30

+0

當然。我會在幾分鐘內將每種方法的訪問方法放在適當的位置。現在,試試:'simResults.Sim1';或'temp = simResults.Sim1';甚至是'names = fieldNames(simResults)',後面跟着'simResults。(names {1})''。 – Pursuit 2013-03-15 18:26:59

3

只是要添加到@Pursuit給出詳細的答案,有一個進一步的方法我很喜歡:

使用結構數組

陣列中的每個項目都是存儲結果和任何附加信息的結構:

simResults(i).name = Sim;   % store the name of the run 
simResults(i).uMatrix = uMatrix; % store the results 
simResults(i).time = toc;   % store the time taken to do this run 

等數組中的每個元素都需要有相同的字段。您可以使用快捷操作提取所有從數組中的元素,例如看到每個運行的時序一目瞭然,你可以這樣做:

[simResults.time] 

您還可以使用arrayfun到這樣的過程,每一個元素數組:

anon_evaluation_func = @(x)(evaluate_uMatrix(x.uMatrix)); 
results = arrayfun(anon_evaluation_func, simResults); 

或者更簡單的語法,

for i = 1:length(simResults) 
    simResults(i).result = evaluate_uMatrix(simResults(i).uMatrix); 
end 
+1

我有時也使用這種方法。 – Pursuit 2013-03-15 18:27:51

+0

感謝您的幫助。這種方法也很好。正如我在回答@Pursuit時所說的,我只是想知道使用結構數組而不是創建結構是否有優勢? – Adam 2013-03-15 23:33:02

+0

該方法(結構數組):更容易遍歷(不需要先獲取字段名),可以支持任何名稱(包括空格),可以支持附加的數據字段(例如「time」,如本例所示。你的編碼技能已經足夠,這比一個帶有命名字段的簡單結構要好。 – Pursuit 2013-03-16 00:31:25