以字母数字顺序加载MATLAB .mat文件

时间:2012-10-10 10:24:33

标签: matlab sorting analysis

我目前正在尝试加载大量MATLAB文件,这些文件都包含相同的变量,以便生成所有值的矩阵。

这些文件都以一个数字(即40_analysed.mat)开头,这个数字先前是使用正则表达式从不同的原始数据文件中提取的,这意味着我有一个由所有单个数字(id)组成的向量。

当我尝试使用下面的代码加载值并在单个矩阵中显示所有个体的数据时,文件不会按字母数字加载(即根据id),而是显示为随机加载。

file = dir('*_analysed.mat');
for i=1:length(id);
    load(file(i).name,'means');
    overallThresholds{i} = means;
end
overallMeans = cell2mat(overallThresholds)

我怎么能这样做,结果矩阵的顺序正确?抱歉如果这个问题没有多大意义,那么这个问题有点难以表达出来!

2 个答案:

答案 0 :(得分:1)

当使用dir命令时,不承诺结果将按字母顺序排列。事实上,manual明确表示:

  

dir列出MATLAB当前文件夹中的文件和文件夹。结果   出现在操作系统返回的顺序中。

即使您确实按字母顺序排列,也没有任何事情可以保证您下次会得到它。因此,您必须使用dir命令从sort订购结果。

  [~,order] = sort( {file.name} );
  file = file(order);

答案 1 :(得分:1)

如果您的文件名没有固定的精确数字(因为@FakeDIY指出,这意味着它们已经被排序),您可以这样做:

file = dir('*_analysed.mat');
overalThresholds = cell(1, length(id));
IDs = zeros(1, length(id));
for i = 1:length(id)
    fileName = file(i).name;
    IDs(i)   = str2double( strrep( fileName, '_analysed.mat', '' ) );
    data     = load(fileName, 'means');
    overallThresholds{i} = data.means;
end
[~, reordering] = sort(IDs);
overallThresholds = overallThresholds(reordering);

换句话说,将文件ID存储在单独的数组中,然后使用SORT的第二个输出将overallThresholds重新排序为ID的排序顺序。

(我也预先分配了数组,并使用LOAD的函数形式,但你真的不需要这样做。)