【问题标题】:Saving parts of Matlab cell array保存部分 Matlab 元胞数组
【发布时间】:2013-10-03 12:50:23
【问题描述】:

我正在使用 Matlab 进行一些数据收集,并且我想在每次试验后保存数据(以防万一出现问题)。数据以元胞数组的元胞数组的形式组织,基本格式为

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

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

所以,我的问题:

我可以使用另一种不同的方法来保存部分元胞数组以加快保存速度吗?

(或)

有没有更好的方法来格式化我的数据以适应这个保存过程?

【问题讨论】:

    标签: arrays matlab save


    【解决方案1】:

    作为对@Luis 的回应,我将发布另一种处理这种情况的方法。

    将数据保存在命名变量或文件中确实是一种选择,但是将命名变量保存在命名文件中似乎太多了。

    如果只更改文件名,可以不使用eval保存所有内容:

    假设您正在处理试验“t”:

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

    如果你真的想要,你可以使用打印命令将它写成001。

    现在你可以简单地使用这个了:

    save(filename, myData)
    

    要使用它,请再次构造文件名,如下所示:

    totalData = {}; %Initialize your total data
    

    然后在您编写它们时阅读它们(在循环内):

    load(filename)
    totalData{t} = myData
    

    【讨论】:

    • 我认为(Java 风格)'temp_save_file_' + num2str(t) 你的意思是['temp_save_file_' num2str(t)]
    • @LuisMendo 谢谢,确实想这样做。
    【解决方案2】:

    一个不太优雅但可能有效的解决方案是使用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)])
    

    data_1保存在文件temp_save_file_1等中

    【讨论】:

      【解决方案3】:

      更新:

      实际上,它似乎可以索引到元胞数组,而不是在元胞数组之外。因此,如果您存储数据的方式略有不同,您似乎可以使用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
      

      如果您的数据始终处于(或处于)特定大小,您还可以选择将数据存储在矩阵而不是元胞数组中,然后您可以使用索引来仅保存文件的一部分。

      【讨论】:

        猜你喜欢
        • 2017-12-03
        • 2014-01-29
        • 2011-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多