我使用提供的函数here在直方图上计算了平滑度。根据我的理解,下图中标记为0.5点的点是直方图的导数等于零,即平滑曲线在下降时与仓相交的点。如何在不显示直方图的情况下自动或数字计算此点(通过计算)?
答案 0 :(得分:1)
您可以从示例中删除所有绘图命令。 它归结为以下几点:
y = [randn(1,5001), randn(1,2001)+6];
[heights,centers] = hist(y);
n = length(centers);
w = centers(2)-centers(1);
t = linspace(centers(1)-w/2,centers(end)+w/2,n+1);
dt = diff(t);
Fvals = cumsum([0,heights.*dt]);
F = spline(t, [0, Fvals, 0]);
DF = fnder(F); % computes its first derivative
现在,您如何获得DF的实际数据点?如果您阅读manual page for fnplt
,您会发现将其分配给变量会产生数据点而不会产生图。
pts = fnplt(DF);
现在我们只检查数据的位置> 0
以及符号更改的位置:
pts(2, find(diff(pts(1,:) > 0) == -1) + 1)
让我们把它分开:
pts(1,:) > 0
创建一个逻辑向量,其中样条曲线大于0,否则为0。
diff(pts(1,:) > 0)
计算连续元素之间的差异。当pts(1,:)
从1更改为0时,这将为-1。使用find
,我们可以找到这些转换的位置。这将为我们提供样本在去往或经过0之前仍为正的最后几点。最后,我们添加1以获得符号更改后样条曲线的位置。