Matlab:当数据在数组中时,查找给定y值的内插x值

时间:2011-07-23 15:06:42

标签: matlab

我有一个x值数组和一个y值数组。绘制时,有两个峰值,其中这些区域的坡度非常陡峭。我的目标是找到那些峰值的FWHM。我可以找到y的半值,但是考虑到斜率的陡度以及我的数据在数组中的事实,我很难找到对应于这个y值的4个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

当我运行此代码时,有4个M阵列,但每次都被覆盖。我怎样才能“保存”这些数组,以便我以后再回忆起来?有没有更简单的方法解决这个问题?如果我能澄清我的问题,请告诉我。非常感谢!

2 个答案:

答案 0 :(得分:0)

我可以提供一个保存数组供以后使用的答案,我可以想到三种方法。

1)将数组保存到matfile。在条件语句之后放置以下行,将数组保存到名为saved_array_k.mat的matfile中,其中k是迭代编号。

M = [yarray(k) yarray(k+1) k k+1];
save(['saved_array_' num2str(k) '.mat'],'M');

2)您还可以使用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];

希望这会有所帮助。

答案 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