【问题标题】:Load Multiple .mat Files to Matlab workspace将多个 .mat 文件加载到 Matlab 工作区
【发布时间】:2012-07-16 04:32:05
【问题描述】:

我正在尝试将几个 .mat 文件加载到工作区。但是,它们似乎相互覆盖。相反,我希望它们附加。我知道我可以这样做:

S=load(file1)
R=load(file2)

等等

然后手动追加变量。

但是有很多变量,并且为每个变量添加一个附加语句是非常不可取的(尽管可能作为最后的手段)。有什么方法可以让我将 .mat 文件加载到工作区(通过使用没有分配的 load() 命令)并附加它们?

【问题讨论】:

  • “它们似乎相互覆盖”是指这些 .mat 文件中的变量名相同吗?如果是这种情况,则无能为力,除非您一个接一个地加载文件,然后重命名两个文件共享的变量,然后再加载下一个文件。
  • 是的,我就是这个意思。那太糟糕了。不过谢谢

标签: matlab matlab-load


【解决方案1】:

“附加”是什么意思并不完全清楚,但这是一种将数据加载到易于处理的格式的方法:

file_list = {'file1';'file2';...};
for file = file_list'
    loaded.(char(file)) = load(file);
end

这利用动态字段引用将列表中每个文件的内容加载到 loaded 结构的自己的字段中。您可以从这里迭代字段并根据需要操作数据。

【讨论】:

  • 这不是我想要的答案,但可能是下一个最好的事情,因为我想要的东西无法完成。我会继续接受它。
  • 加载所有内容后,您可以使用fieldnames 找出您已加载到结构中的所有不同变量。然后,您可以eval 将它们放入工作区(而不仅仅是在结构中),根据需要“附加”(无论您如何定义)。
【解决方案2】:

听起来您遇到的情况是,每个文件都包含一个矩阵变量 A,并且您希望将所有这些矩阵沿某个维度的串联加载到内存中。我也有类似的需求,写了如下函数来处理。

function var = loadCat( dim, files, varname )
%LOADCAT Concatenate variables of same name appearing in multiple MAT files
%  
%   where dim is dimension to concatenate along,
%         files is a cell array of file names, and
%         varname is a string containing the name of the desired variable

    if( isempty( files ) )
        var = [];
        return;
    end
    var = load( files{1}, varname );
    var = var.(varname);

    for f = 2:numel(files),

        newvar = load( files{f}, varname );
            if( isfield( newvar, varname ) )
                var = cat( dim, var, newvar.(varname) );
            else
                warning( 'loadCat:missingvar', [ 'File ' files{f} ' does not contain variable ' varname ] );
            end
        end 

    end

【讨论】:

    【解决方案3】:

    Clark 的答案和函数实际上完美地解决了我的情况……我只是添加了以下代码以使其不那么乏味。只需将其添加到开头并去掉“文件”参数:

    [files,pathname] = uigetfile('*.mat', 'Select MAT files (use CTRL/COMM or SHIFT)', ...
       'MultiSelect', 'on'); 
    

    或者,从这一点开始可能会更有效率:

    [pathname] = uigetdir('C:\');
    files = dir( fullfile(pathname,'*.mat') );   %# list all *.mat files
    files = {files.name}';                       %# file names
    
    data = cell(numel(files),1);                 %# store file contents
    for i=1:numel(files)
        fname = fullfile(pathname,files{i});     %# full path to file
        data{i} = load(fname);                   %# load file
    end
    

    (修改自process a list of files with a specific extension name in matlab)。

    谢谢, 杰森

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-31
      • 2012-01-02
      • 1970-01-01
      • 2015-04-22
      • 1970-01-01
      • 1970-01-01
      • 2021-07-04
      • 2016-10-08
      相关资源
      最近更新 更多