Matlab 迭代文件名以便保存

3
这个关于matlab的问题: 我正在运行一个循环,每次迭代会生成一组新的数据,并且我希望每次都将其保存在一个新文件中。我还通过更改名称覆盖旧文件。看起来像这样:
name_each_iter = strrep(some_source,'.string.mat','string_new.(j).mat')

我在这里遇到的问题是迭代,以便我获得文件: ...string_new.1.mat ...string_new.2.mat 等等。
我试过各种() [] {}的组合,以及'string_new.'j'.mat'(这会导致语法错误)。
应该如何做?
4个回答

6

字符串就是字符向量。因此,如果你想迭代地创建文件名,下面是一个示例:

for j = 1:10,
   filename = ['string_new.' num2str(j) '.mat'];
   disp(filename)
end

上述代码将创建以下输出:
string_new.1.mat
string_new.2.mat
string_new.3.mat
string_new.4.mat
string_new.5.mat
string_new.6.mat
string_new.7.mat
string_new.8.mat
string_new.9.mat
string_new.10.mat

它在保存新文件时非常有效,但在覆盖时对我来说不起作用,当我使用带有“num2str(j)”的strrep时。我漏掉了什么吗? - beginh

5
你可以使用NUM2STR预先生成所有文件名:
>> filenames = cellstr(num2str((1:10)','string_new.%02d.mat'))

filenames = 
    'string_new.01.mat'
    'string_new.02.mat'
    'string_new.03.mat'
    'string_new.04.mat'
    'string_new.05.mat'
    'string_new.06.mat'
    'string_new.07.mat'
    'string_new.08.mat'
    'string_new.09.mat'
    'string_new.10.mat'

现在,在每次迭代中,可以将单元数组的内容作为filenames{i}访问。

3

sprintf对此非常有用:

for ii=5:12
    filename = sprintf('data_%02d.mat',ii)
end

此代码将以下字符串分配给 filename:
    data_05.mat
    data_06.mat
    data_07.mat
    data_08.mat
    data_09.mat
    data_10.mat
    data_11.mat
    data_12.mat

注意零填充。总的来说,sprintf在需要参数化格式化字符串时非常有用。


谢谢!又一个好主意。但是如何将其与替换已有名称的字符串部分相结合呢? - beginh
始终以这种方式保存您的文件,这样您就可以轻松重建文件名。 - Gunther Struyf
真实的情况是,您可能可以访问一些文件的结构,只需在保存时替换其中某些名称部分即可。这就是为什么我坚持使用strrep的原因,因为我想在完全不知道这些名称的情况下搜索文件名中的某个字符串。 - beginh

1

如果要基于已有文件创建名称,可以使用正则表达式来检测“_new.(number).mat”,并根据正则表达式找到的内容更改字符串:

original_filename = 'data.string.mat';
im = regexp(original_filename,'_new.\d+.mat')
if isempty(im) % original file, no _new.(j) detected
    newname = [original_filename(1:end-4) '_new.1.mat'];
else
    num = str2double(original_filename(im(end)+5:end-4));
    newname = sprintf('%s_new.%d.mat',original_filename(1:im(end)-1),num+1);
end

这正是它的作用,并产生以下结果:

    data.string_new.1.mat
    data.string_new.2.mat
    data.string_new.3.mat
    ...

    data.string_new.9.mat
    data.string_new.10.mat
    data.string_new.11.mat

当迭代上述函数时,从'data.string.mat'开始


谢谢,现在我找到了最简单的解决方案 :) name_each_iter = strrep(some_source,'.string.mat',['string_new.' num2str(j) '.mat']) 因此,在这种情况下添加方括号就足以迭代。 - beginh

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