2013-09-27 102 views
2

我正在使用Matlab進行一些數據收集,並且我想在每次試驗後保存數據(以防出現問題)。的數據被組織爲單元陣列的單元陣列,基本上在格式保存部分Matlab單元陣列

data{target}{trial} = zeros(1000,19) 

但實際的數據被收集的端部起以> 150 MB,所以每次試驗後保存一切都變得過於緩慢。 所以現在我正在考慮選擇matfile方法(http://www.mathworks.de/de/help/matlab/ref/matfile.html),這將允許我只保存部分數據。問題:這不支持單元格數組的單元格,這意味着我無法更改/更新單個試驗的數據;我將不得不重新保存整個目標的數據(100次試驗)。

所以,我的問題:

是否有另一種不同的方法,我可以用它來保存單元陣列,加快節約的部分?

(OR)

有沒有更好的方式來格式化我的數據,將與該保存過程工作?

回答

1

不是很優雅,但可能有效的解決方案是使用trial作爲變量名稱的一部分。也就是說,不使用單元陣列的單元陣列(data{target}{trial}),而只使用不同的單元陣列,如data_1{target},data_2{target},其中1,2是trial計數器的值。

你可以做到這一點與eval:例如

trial = 1; % change this value in a for lopp 
eval([ 'data_' num2str(trial) '{target} = zeros(1000,19);']); % fill data_1{target} 

然後,您可以將數據保存在不同的文件中的每個審判。例如,這

eval([ 'save temp_save_file_' num2str(trial) ' data_' num2str(trial)]) 

保存在文件temp_save_file_1data_1

0

更新:

其實它似乎是可能的索引單元陣列,只是沒有iside電池陣列。因此,如果您存儲的數據稍有不同,那麼您可以使用matfile更新其中的一部分。看到這個例子:

x = cell(3,4); 
save x; 
matObj = matfile('x.mat','writable',true); 
matObj.x(3,4) = {eye(10)}; 

請注意,這給了我一個版本警告,但它似乎工作。

希望這可以做到。但是,請繼續關注我的答案的下一部分,因爲這可能會對您有所幫助。


對於計算,通常不需要在每次迭代後保存到磁盤。獲得加速的簡單方法(以更多風險爲代價)是每n次試驗後才能保存。

喜歡本作例子:

maxTrial = 99; 
saveEvery = 10; 

for trial = 1:maxTrial 
    myFun; %Do your calculations here 
    if trial == maxTrial || mod(trial, saveEvery) == 0 
     save %Put your save command here 
    end 
end 

如果您的數據始終處於(或內)一定大小時,你也可以選擇保存在一個矩陣,而不是一個單元陣列的數據,那麼你可以使用索引來保存文件的一部分。

0

針對@Luis我會發佈一個其他的方式來處理這種情況。

確實可以將數據保存到命名變量或文件中,但將命名變量保存在命名文件中似乎太多了。

如果只更改文件的名稱,可以節省一切,而不需要使用eval:

假設你正在處理的審判「T」:

filename = ['temp_save_file_' + num2str(t)]; 

如果你真正想要的,你可以例如,使用打印命令將其寫爲001。

現在,你可以簡單地使用:

save(filename, myData) 

要使用此,再等等構造的文件名是這樣的:

totalData = {}; %Initialize your total data 

,然後讀他們爲你寫了他們(在一個循環內):

load(filename) 
totalData{t} = myData 
+1

我想通過(Java風格)''temp_save_file_'+ num2str(t)'你的意思是'['temp_save_file_'num2str(t)]' –

+0

@LuisMendo謝謝,真的想這麼做。 –