Matlab:加载.mat文件,为什么它是一个结构体?我能否只将存储的变量加载到内存中?

9

相关代码:

function result = loadStructFromFile(fileName, environmentName) 
    result = load(fileName, environmentName);


bigMatrix = loadStructFromFile('values.mat','bigMatrix'); 

但是当我查看工作区时,它显示“bigMatrix”为一个1x1的结构体。然而,当我点击该结构体时,它实际上是数据本身(在这种情况下是一个998x294的矩阵)。
4个回答

10
根据LOAD文档的指示,如果你使用输出参数调用它,则结果将以结构体的形式返回。如果没有使用输出参数调用,则变量将在本地工作区中创建,并使用与保存时相同的名称。
对于您的loadStructFromFile函数,如果保存的变量名称可能有不同的名称(假设为environmentName),则可以通过编写以下内容来返回变量:
function result = loadStructFromFile(fileName, environmentName) 
    tmp = load(fileName, environmentName);
    result = tmp.(environmentName); 

1
真是恶心的API设计(Matlab的load())...不过还是谢谢你的解释! - andrgolubev

3
即使你只指定一个变量名,LOAD 仍会将其输出为一个结构体。在你的情况下,你可以使用函数STRUCT2CELLLOAD的输出转换为一个单元数组,然后使用变量输出参数列表返回此结果:
function varargout = loadStructFromFile(fileName,environmentName)
  varargout = struct2cell(load(fileName,environmentName));
end

使用VARARGOUT的好处是,如果environmentName在.MAT文件中匹配多个变量,您可以从函数中返回它们所有。例如,如果您的.MAT文件有三个变量N1N2N3,而environmentNameN*,您可以通过调用多个输出的函数来获取它们:

[N1,N2,N3] = loadStructFromFile('values.mat','N*');

2

虽然这是一篇旧文章,但如果对一些人有用:

当您加载结构并且想要直接将子字段分配到输出结构中时,您可以使用structfun和以下命令:

bigMatrixOUT = structfun(@(x) x,load('values.mat','bigMatrix'))

bigMatrixOUT 将直接包含 bigMatrix 的字段,而不是 bigMatrixOUT.bigMatrix


1
你也可以尝试使用点表示法访问已知字段,以便所有操作都在一行代码中完成。
bigMatrix = load('values.mat','bigMatrix').bigMatrix; 

或者

bigMatrix = load('values.mat','bigMatrix').('bigMatrix'); 

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