2014-04-11 55 views
1

我有一個由循環創建的變量。該變量足夠大,並且形式複雜,我希望每次使用不同的名稱出現循環時都保存該變量。基於字符串的名稱變量MATLAB

PM25是我的變量。但我想將其保存爲PM25_year,其中,基於`海峽= FNAME年的變化(13:結束)」

PM25 = permute(reshape(E',[c,r/nlay,nlay]),[2,1,3]); % Reshape and permute to achieve the right shape. Each face of the 3D should be one day 
str = fname(13:end); % The year 

% Third dimension is organized so that the data for each site is on a face 
    save('PM25_str', 'PM25_Daily_US.mat', '-append') 

該海峽是一年,像2008年那麼保存的將是PM25_2008變量,然後PM25_2009等,因爲它是創建。

回答

2

定義基於數據的新變量,不認爲是最佳做法,但可以使用單元陣列,更有效地存儲數據。你甚至可以在一個單元內存儲一個大的,複雜的變量,比如你的PM25變量。這裏是你怎麼會去這樣做:用你的循環

將您的PM25數據每年到單元陣列C

for i = 1:numberOfYears 
    C{i} = PM25; 
end 

的東西得到的是這樣的:

C = { PM25_2005, PM25_2006, PM25_2007 }; 

現在假設你想獲得2006年的變量。這很容易(假設你沒有跳過幾年)。您的數據的第一年,將與位置1,第二年至位置2,等等。所以要找到你想要在今年指數:

minYear = 2005; 
yearDesired = 2006; 
index = yearDesired - minYear + 1; 
PM25_2006 = C{index}; 
1

您可以使用eval來做到這一點,但請注意,這通常不被認爲是好的做法。 eval可能會帶來安全風險,因爲它允許用戶輸入作爲代碼執行。更好的方法是使用單元格數組或對象數組。

這麼說,我認爲這會做你想要什麼:

for year = 2008:2014 
    eval(sprintf('PM25_%d = permute(reshape(E',[c,r/nlay,nlay]),[2,1,3]);',year)); 
    save('PM25_Daily_US.mat',sprintf('PM25_%d',year),'-append'); 
end 
0

我不建議這樣設置變量,因爲有沒有辦法跟蹤這些變量,並且完全防止了MATLAB預先執行的各種錯誤檢查。這種代碼在運行時完全處理。

無論如何,如果你有一個真的這樣做的好理由我建議你使用這個功能assignin

assignin('caller', ['myvar',num2str(1)], 63);