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

4 回答 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
于 2012-07-26T16:22:13.883 回答
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}现在像在每次迭代中一样访问元胞数组内容

于 2012-07-26T16:37:20.483 回答
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 通常很有用。

于 2012-07-26T16:34:08.293 回答
1

要根据现有文件创建名称,您可以使用regexp检测“_new.(number).mat”并根据 regexp 找到的内容更改字符串:

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' 开头

于 2012-07-26T17:05:58.480 回答