2013-09-27 101 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谢谢,真的想这么做。 –