2015-07-01 19 views
0

我想在循環中按順序加載文件以實現長功能。我的文件是形式var1_var2.mat可以從字符串中選擇三個選項之一的變量(MATLAB)?

我的環路的形式構成的:

directory = place 

for var= 1 : somebound 
    for var2= 1: someotherbound 
     curFname = [directory in2str(var1) '_' in2str(var2) '.mat']; 

     load files and do stuff 

    end 
end 

不過,我已經改變了我的命名約定到一組文件可以有第三個下劃線,這可以是1,2或3,具體取決於數據來自的特定條件。

所以,現在我的文件從1_1.mat格式化說1_1_3.mat

如何我在curFname創建的第三個字符= [...]行代碼,可以採取變化的第三個任期1 ,2還是3?它需要被定義爲變量,因爲沒有1_1_1.mat,1_1_2.mat和1_1_3.mat,可能只是1_1_1.mat

例如,可能有1_2_3.mat。但不是1_2_1.mat或1_1_1.mat

+1

難道你不能只使用try/catch或檢查文件是否存在? –

+0

開始於'dir('*。mat')' – Daniel

回答

0

dir命令對於這樣的事情很有價值 - 您會在某個文件夾中獲得一個完整的字符串數組。就像在操作系統中一樣,您可以獲取文件名,上次修改日期等信息。

考慮到這一點,我相信你的問題的答案在於控制流程,即使用條件語句,如果,一會兒,或任何適合你的需要。例如:

for var = 1 : somebound 
    variable = dir('foldername'); 
    if (check your strings and process) ... 

依此類推。從本質上講,你將需要許多有用的MATLAB字符串命令,比如strfind,strcmp和strlen。安排你的邏輯來滿足你的格式。

+0

如果(file = conditions),我怎樣才能以 的形式編寫if語句?我知道如何編寫條件,但我如何引用一個模糊的文件? –

+0

你應該有幾個外部for循環遍歷每個地方的每個數字。看看你的例子1_2_3.mat。你的第一個循環可以檢查第一個地方,這裏是1(因爲Matlab把字符串當作字符數組,所以你在這裏檢查第一個字符)。如果數組認爲,你再循環兩次,下一個數字(2,第三個字符)和下一個(3,第五個)各一個。這聽起來像你的文件不是「模棱兩可的」,因爲他們有一個命名約定。當你運行你的循環時,你通過1-9遞增來檢查所有可能的數字。 – Kwaaaaaah

+0

除了這個建議,我可能不是最有幫助的;你應該等待,看看是否有更好的答案。 GL,HF! – Kwaaaaaah

1

您可以通過try/catch語句做到這一點,是這樣的:

success = false; 
for it1 = 1:range1 
    for it2 = 1:range2 
     for it3 = 1:3 
      filename = strcat(int2str(it1), '_', int2str(it2), '_', int2str(it3), '.mat'); 
      try 
       load(filename); 
       success = true; 
      catch 
       continue; 
       success = false; 
      end 
      if success 
       %do some amazing stuff 
      end 
     end 
    end 
end 

另一種方式來做到這一點是讓所有的.MAT文件並加載它們

files = dir('*.mat'); 
for file = 1:length(files) 
    load(files(file).name); 
    %do some even more amazing stuff 
end 

如果有其他.mat文件,並且你不想加載它們,那麼你可以使用正則表達式:

files = dir('*.mat'); 
for file = 1:length(files) 
    filename = files(file).name; 
    if regexp(filename, '[1-9][0-9]*_[1-9][0-9]*_[1-3].mat') 
     load(filename); 
     %do some even more amazing stuff 
    end  
end 

如果你不知道regexp,它匹配另一個字符串上的字符串模式,您將在MATLAB Doc上找到更多信息。在我的例子,

[1-9]是任何數字1-9之間

[1-3]是用3

*相同意味着先前的字符可以存在一次或多次。所以[0-9]*nothing[0-9][0-9][0-9][0-9][0-9][0-9]

你可以找到更多關於MATLAB的正則表達式here

編輯:

我不這樣做,因爲[1-n]正則表達式的特定語法的。這是一個有點難以解釋,但會盡我所能:

regexp比賽字符,通過鍵入[1-x],我basicly說MATLAB的「我要一個字符的字符代碼爲1的字符代碼和字符代碼之間的x「。所以輸入[1-9]是有道理的。

另一方面,10或25或高於9的任何數字。讓我們以爲例。 39不是一個字符,它由2個字符組成。所以在正則表達式中匹配39是匹配3,然後9.所以[1-39]將無法​​正常工作,但[1-3][0-9]|[1-9]會。

+0

我肯定會去的正則表達式版本。如果你在這種情況下提到正則表達式,可以很好地判斷範圍1到n不只是'[1-n]'。 – Matt

+0

是的,只要我使用'+'編寫這個,看起來很明顯,但是你提出了一個好點 – Ikaros

+0

在我看來,使用+是很好的。編輯:對於一個範圍,你需要覆蓋所有的可能性。因此,例如1-35將是'(3 [0-5] | [12] [0-9] | [1-9])''。 – Matt

相關問題