如何在MATLAB中不加载文件的情况下检查MAT文件的内容?

14

我有一个存储在MAT文件中的大数据结构。我想检查该结构中是否存在特定字段,而不需要加载MAT文件,因为内容非常大,我希望尽量减少内存使用。

这是否可能?或者我必须像下面的示例一样先加载它?

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

24

要检查MAT文件的内容而不加载它,请使用:

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

@Jonas:上面的代码只检查变量名。所以像你在答案中提到的那样,用户应该在保存到MAT文件时使用SAVE的“-struct”选项将结构字段拆分为单独的变量。 - Amro
2
@Jonas:否则,如果用户真的关心内存使用情况,我们可以将字段名与实际MAT文件一起写入单独的文本文件中,然后在加载实际结构数据之前根据需要加载和检查文本文件。 - Amro
你还可以将字段名称列表(或其他元数据)保存在与原始结构相同的.mat文件中的单独变量中(例如,“fnames = fieldnames(s); save('myfile.mat','fnames','s')”),然后使用“load(filename,varname)”形式有选择地读取它。这样可以通过将数据和索引保存在单个文件中来简化文件管理。Amro的将其拆分为单独变量的方法也可以让您有选择地加载结构的部分;而这种方法则不行。如果其中有大型cellstr数组,请在保存之前将它们转换为char。这样可以节省空间和时间。 - Andrew Janke

7
据我所知,要检查保存的结构中是否包含特定字段,必须先加载文件。但是,如果使用'-struct'选项保存.mat文件,则会将字段拆分为单独的变量存储在.mat文件中。您可以通过调用相应函数重新创建结构。
myStructure = load('test.mat');

这种方式还允许您使用@Amro的方法来测试字段(变量)是否存在(该方法比我之前建议的更加简洁)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接