2011-07-23 80 views
0

我有一個x值數組和一個y值數組。繪製時,有兩個峯值,這些區域的斜率非常陡峭。我的目標是找到這些峯的FWHM。我可以找到y的最大值,但鑑於斜率的陡峭性和我的數據在數組中的事實,我很難找到與這個y值相對應的4個x值。Matlab:當數據在一個數組中時,給出y值的插值x值

我正在考慮使用循環直接在給定的y值之前和之後找到點,然後使用它們來擬合一條線(高的斜率使得曲線可以用線性方程近似小區域)並使用這些方程來查找插值的x值,從中我可以計算出全寬度。

這裏是我的編碼這個至今:

% yarray is list of y values 
    % A = y value where I need to find the 4 corresponding x values 
    for k = 1:length(yarray)-1 
     if yarray(k+1) <= A & yarray(k) >= A 
      M = [yarray(k) yarray(k+1) k k+1] 
     elseif yarray(k+1) >= A & yarray(k) <= A 
      M = [yarray(k) yarray(k+1) k k+1] 
     end 
    end 

當我運行這段代碼,有4M的陣列,但是每次都被覆蓋。我怎樣才能「保存」這些陣列,以便以後再調用?有沒有更簡單的方法來解決這個問題?如果我能澄清我的問題,請告訴我。非常感謝!

+0

格式化你的代碼。請檢查它是否符合你的意圖。謝謝 – eat

回答

0

我可以提供一個保存數組供以後使用的答案,我可以想到三種方法。

1)將數組保存到matfile中。在條件語句後面放置以下行,以將該數組保存到名爲saved_array_k.mat的mat文件,其中k是迭代編號。您可以使用eval調用動態創建四個數組。喜歡的東西替換你的條件表達式中的每個賦值語句:

eval(['M' num2str(k) '= [yarray(k) yarray(k+1) k k+1];']); 

在你的情況,這將產生變數,M1M2M3M4而且每次都會包含您想要的信息。

3)創建一個矩陣,其結果是矩陣的每一行都包含您想要的數據。 (這可能是最好的)。創建一個矩陣M

M = zeros(4); % each of your arrays has length 4 and there are 4 of them 

在你的賦值語句使用:

M(:,k) = [yarray(k) yarray(k+1) k k+1]; 

希望這有助於。

0

是的,有更簡單的方法來解決你的問題,是的,你應該澄清你的問題。 (例如,不要認爲像FWHM這樣的縮略詞是衆所周知的,你可能想描述你的數據來自哪裏,而且你的問題真的與插值有關)。

無論如何,一個峯值一個簡單的演示可以弄清情況:

>>> x= linspace(0, pi, 100); y= sin(x); 
>>> mi= min(y); ma= max(y); 
>>> x_above= x(y> (ma- mi)/ 2); 
>>> fwhm= x_above(end)- x_above(1) 
fwhm = 2.0627