我有一个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阵列,但每次都被覆盖。我怎样才能“保存”这些数组,以便我以后再回忆起来?有没有更简单的方法解决这个问题?如果我能澄清我的问题,请告诉我。非常感谢!
答案 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];']);
在您的情况下,这会生成变量M1
,M2
,M3
,M4
,每个变量都会包含您想要的信息。
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