2012-07-26 96 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}在每個迭代