现在我想插值以在它们之间制作曲线,但是遵循下一个公式。例如,以10k的价格估算ECDF,应由F(10k)=αF1+(1-α)F2引导; 0 <α<1。我绘制的曲线是通过ecdf函数得到的。我试图用interp1来模拟观察但是我没有用它来模拟新价格的观察结果。
所以我尝试使用@rayryeng的代码
max_len = max(数字(F1),数字(F2)); F1_interp = interp1(1:numel(F1),F1(:)。',linspace(1,numel(F1),max_len)); F2_interp = interp1(1:numel(F2),F2(:)。',linspace(1,numel(F2),max_len));
alpha =(10e3 - 9.5e3)/(11e3 - 9.5e3); Fnew = alpha * F1_interp +(1-alpha)* F2_interp;
答案 0 :(得分:2)
如果您遵循该公式,则根本不需要interp1
。您可以认真地计算F(10k)
,alpha*F1 + (1-alpha)*F2
alpha
介于[0,1]
之间,如果我正确地解释您的问题,那么就可以alpha
。
在F1
的情况下,这是在F2
看到的值和在alpha = (ffnew - ff1) / (ff2 - ff1)
看到的值之间的分数。在您的情况下,这很简单:
ff1
ff2
和ffnew
是您想要的值之间的价格,即ffnew = ff1
。您可以验证alpha = 0
,然后是F2
并获得原始的ffnew = ff2
曲线。同样,如果alpha = 1
,则为F1
,因此您将获得原始的F1
曲线。在F2
和alpha
之间的任何价格值,您只需明智地指定alpha
。
因此,对于ff1 = 9.5k
和ff2 = 11k
以及fnew = 10k
的情况,alpha = (10e3 - 9.5e3) / (11e3 - 9.5e3) = 0.33333...
将为:
F1
因此,假设F2
和9.5k
分别是11k
和alpha = (10e3 - 9.5e3) / (11e3 - 9.5e3);
Fnew = alpha*F1 + (1-alpha)*F2;
处的曲线:
interp1
以上假设您的信号长度相同。如果不是,则必须插入较小的信号,使其与较大的信号长度匹配。 F1
是此处使用的工具(恕我直言)。您可以将键/控制点指定为interp1
的点。但是,(x,y)
需要x
对,我们没有任何y
值.... F1
值来自x
。因此,您将人工创建linspace
值作为正在增加的数值向量。我能想到的最简单的一个是从1到多个值的向量,与较小的信号一样多。要扩展信号,您将生成另一个向量,该向量在较小的信号中再次从1到多个值,但我们使用max_len = max(numel(F1),numel(F2));
F1_interp = interp1(1:numel(F1), F1(:).', linspace(1,numel(F1),max_len));
F2_interp = interp1(1:numel(F2), F2(:).', linspace(1,numel(F2),max_len));
alpha = (10e3 - 9.5e3) / (11e3 - 9.5e3);
Fnew = alpha*F1_interp1 + (1-alpha)*F2_interp2;
创建点数为更大的信号。
因此,尝试这样的事情:
F1
第一行代码找到两个信号长度中最大的一个。接下来,我们确保F2
和F1
的长度相同。结果是其中一个不会改变,而另一个将扩展以匹配更大的信号。以上是为了确保两个信号的长度相同,无论F2
和func checkForAnagram(firstString firstString: String, secondString: String) -> Bool {
return firstString.lowercaseString.characters.sort() == secondString.lowercaseString.characters.sort()
}
是什么。完成此操作后,您可以在新信号上正常应用我们上面谈到的操作。