【问题标题】:How to load only one entry of a cell from a .mat file in Matlab?如何从 Matlab 中的 .mat 文件中仅加载一个单元格的条目?
【发布时间】:2017-05-30 14:05:18
【问题描述】:

我有一个 1 x 5 的单元格,其中包含 5 个非常大的矩阵。我怎样才能只加载我想要的一个矩阵,而不是加载整个单元格,这会占用我的大部分内存?

类似

M2 = load('Cellmat{2}');

应将M2定义为单元格Cellmat中的第二个矩阵,该矩阵先前已由save('Cellmat','Cellmat');保存到目录中。

【问题讨论】:

    标签: matlab import


    【解决方案1】:

    完成此操作的唯一方法是使用matfile 读取文件,因为这样您只能读取parts of variables。它还假设文件最初以7.3 格式保存

    matfile 仅支持对 7.3 版格式的 MAT 文件进行高效的部分加载和保存。如果您在版本 7(当前默认值)或更早的 MAT 文件中为变量编制索引,MATLAB® 会发出警告并临时加载该变量的全部内容。

    因此,最初要保存数据,您需要指定 -7.3 标志。

    save('Cellmat.mat', 'Cellmat', '-v7.3')
    

    然后您可以使用matfileCellmat 加载只是您想要的元素。请注意,您必须使用() 索引来访问它(这将产生一个单元格,然后我们可以索引到该单元格以获取M2)并且您必须在索引到Cellmat 时指定行和列下标。

    mat = matfile('Cellmat.mat');
    
    % A little workaround because you can't use {} indexing on matfile objects
    tmp = mat.Cellmat(1, 2);
    M2 = tmp{1};
    

    “老派”的替代方法是将您的元胞数组分解为单独的变量并仅保存/加载这些变量

    thing = Cellmat{1};
    other_thing = Cellmat{2};
    
    save('Cellmat.mat', 'thing', 'other_thing');
    
    % Only load in one variable
    M2 = load('Cellmat.mat', 'other_thing');
    

    【讨论】:

    • 谢谢,成功了! Matlab 没有这样做的标准方法似乎很奇怪..
    • @Lovsovs 这执行此操作的标准方式。在matfile 之前,我们必须使用多个变量来完成,正如我在上次编辑中展示的那样
    • 我确信这是最好的方法,这不是我的意思。我只是认为它仍然是一种“hacky”的方法(使用 v7.3和 tmp 和所有爵士乐),即 IMO Matlab 应该有一种更直观的方式来实现相同的目标。再次感谢。 :)
    • @Lovsovs 好吧,所以 7.3 将其保存为 HDF5 文件,这是一种更加模块化的数据类型,可以更好地随机访问数据。而() 索引(导致tmp)是其存储方式的产物。要了解有关这些文件内部的更多信息,您可以查看here
    猜你喜欢
    • 2011-08-25
    • 2013-09-01
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 2017-01-02
    • 2021-07-04
    相关资源
    最近更新 更多