【问题标题】:How can I check the contents of a MAT-file in MATLAB without loading it?如何在不加载 MATLAB 的情况下检查 MAT 文件的内容?
【发布时间】:2011-04-30 21:55:27
【问题描述】:

我在 MAT 文件中有一个大型结构。我想检查结构中是否存在特定字段 不加载 MAT 文件,因为内容非常大,我想尽量减少内存使用。

这可能吗,还是我必须像下面的例子一样先加载它?:

load('test.mat');             %# Load the MAT-file
tf = isfield(s,'fieldname');  %# Check if structure s has field 'fieldname'

【问题讨论】:

    标签: matlab struct mat-file


    【解决方案1】:

    据我所知,您必须加载文件才能检查保存的结构是否包含特定字段。

    但是,如果您使用 '-struct'-option 保存 .mat 文件,它会将字段拆分为 .mat 文件中的单独变量。您可以通过调用来重新创建结构

    myStructure = load('test.mat');
    

    以这种方式保存还允许您使用@Amro 的方法测试字段(变量)是否存在(这比我之前建议的要干净得多)。

    【讨论】:

      【解决方案2】:

      要在不加载 MAT 文件的情况下检查其内容,请使用:

      vars = whos('-file','test.mat')
      ismember('fieldname', {vars.name})
      

      【讨论】:

      • @Jonas:上面的代码只检查变量名。因此,就像您在回答中提到的那样,用户在保存到 MAT 文件时应使用 SAVE 的 -struct 选项将结构字段拆分为单独的变量。
      • @Jonas:否则,如果用户真的关心内存使用,我们可以简单地将字段名与实际 MAT 文件一起写入单独的文本文件,然后加载并检查文本文件在加载实际结构数据之前根据需要
      • 您还可以将字段名称列表(或其他元数据)保存在与原始结构相同的 .mat 文件中的单独变量中(例如,使用 "fnames=fieldnames(s);save( 'myfile.mat','fnames','s')") 然后选择性地使用 "load(filename, varname)" 形式读取它。可以通过将数据和索引保存在单个文件中来简化文件管理。 Amro 的拆分成单独变量的方法还可以让您有选择地加载结构的某些部分;这个不会。如果你有大的 cellstr 数组,如果可能的话,在保存之前将它们转换为 char。既能节省空间又能节省时间。
      猜你喜欢
      • 2016-11-14
      • 2014-11-06
      • 2013-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-18
      • 1970-01-01
      相关资源
      最近更新 更多