2012-07-26 138 views
3

这个关于matlab的问题: 我正在运行一个循环,每次迭代产生一组新数据,并且我希望每次都将它保存在一个新文件中。我还通过更改名称来覆盖旧文件。看起来是这样的:matlab迭代文件名保存

name_each_iter = strrep(some_source,'.string.mat','string_new.(j).mat') 

和我#m的挣扎这里是迭代让我获取文件: ... string_new.1.mat ... string_new.2.mat 等

我正在尝试各种组合()[] {}以及'string_new.'j'.mat'(它给出了语法错误)

它是如何做到的?

回答

1

用于创建基于现有文件的名称,你可以使用regexp检测“ _new(数字).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”

+0

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

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 
+0

它可以非常好地保存新文件,但对我来说不在覆盖的情况下,所以当我用'num2str(j)'使用strrep时。我忽略了什么? – beginh 2012-07-26 16:44:17

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一般很有用。

+0

谢谢!另一个好主意。但如何将其与替换已有名称的字符串部分结合使用? – beginh 2012-07-26 16:47:20

+0

总是以这种方式保存你的文件,所以你可以很容易地重建文件名。 – 2012-07-26 16:49:48

+0

是真实的,但您可以访问一个准备好的文件结构,您只需在保存时替换某个名称部分即可覆盖这些文件。这就是为什么我坚持使用strrep,因为我想在文件名中搜索某个字符串而不知道这些名字。 – beginh 2012-07-26 16:55:05

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}在每个迭代