我正在使用Matlab进行一些数据收集,我想在每次试验后保存数据(以防出现问题)。数据被组织为单元阵列的单元阵列,基本上采用
格式data{target}{trial} = zeros(1000,19)
但是在收集结束时实际数据达到了> 150 MB,因此在每次试用后保存所有内容变得非常慢。 所以现在我正在考虑选择matfile方法(http://www.mathworks.de/de/help/matlab/ref/matfile.html),它允许我只保存部分数据。问题:这不支持单元格数组,这意味着我无法更改/更新单个试验的数据;我将不得不重新保存整个目标的数据(100次试验)。
所以,我的问题:
我可以使用另一种不同的方法来保存单元阵列的部分以加速保存吗?
(OR)
是否有更好的方法来格式化可用于此保存过程的数据?
答案 0 :(得分:1)
一个不太优雅但可能有效的解决方案是使用trial
作为变量名称的一部分。也就是说,不要使用单元格数组(data{target}{trial}
),而只使用不同的单元格数组,例如data_1{target}
,data_2{target}
,其中1,2是{{1}的值反击。
您可以使用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)])
保存在文件data_1
等
答案 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
如果您的数据始终处于(或在某个特定大小范围内),您还可以选择将数据存储在矩阵而不是单元格数组中,然后您可以使用索引来仅保存文件的一部分。
答案 2 :(得分:0)
为了回应@Luis,我将发布另一种处理这种情况的方法。
确实可以选择将数据保存在命名变量或文件中,但是将命名变量保存在命名文件中似乎太多了。
如果您只更改文件名,则无需使用eval即可保存所有内容:
假设您正在处理试用't':
filename = ['temp_save_file_' + num2str(t)];
如果您真的想要,可以使用打印命令将其写为001。
现在你可以简单地使用它:
save(filename, myData)
要使用它,请再次构造文件名,如下所示:
totalData = {}; %Initialize your total data
然后在编写它们时(在循环内)读取它们:
load(filename)
totalData{t} = myData