保存Matlab单元阵列的部分

时间:2013-09-27 09:17:37

标签: arrays matlab save

我正在使用Matlab进行一些数据收集,我想在每次试验后保存数据(以防出现问题)。数据被组织为单元阵列的单元阵列,基本上采用

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

但是在收集结束时实际数据达到了> 150 MB,因此在每次试用后保存所有内容变得非常慢。 所以现在我正在考虑选择matfile方法(http://www.mathworks.de/de/help/matlab/ref/matfile.html),它允许我只保存部分数据。问题:这不支持单元格数组,这意味着我无法更改/更新单个试验的数据;我将不得不重新保存整个目标的数据(100次试验)。

所以,我的问题:

我可以使用另一种不同的方法来保存单元阵列的部分以加速保存吗?

(OR)

是否有更好的方法来格式化可用于此保存过程的数据?

3 个答案:

答案 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