我在iOS应用程序中使用高斯方程来表示特定的照片效果。
我用:
double sigmaX = ...; //some value here
for(int i=0;i<height;i++)
{
double F = 0;
double step = -(pos)*width/20;
/*height,width,pos - all predefined, no problem there*/
for(int j=0;j<4*width;j+=4)
{
F = (double) ((1/1)*exp(-sigmaX*(pow((step++)/1, 2.0)))) ;
//do some operation here...
}
}
并且F的值用于确定在其他地方消耗的特定强度。
到目前为止一直都很好...... F是预期的典型钟形曲线。
但问题是,我想根据用户输入缩放此曲线的标准偏差。
例如,在下图中,我想将曲线从绿色线移到红色线(蓝色可能是中间线),希望以线性步骤:
现在,给出标准符号:
并将其与我在代码中实现它的方式进行比较,我有了改变1 / sqrt(sigmaX)以改变比例/ SD的想法。我尝试以线性步长(以获得线性增量)递增1 / sqrt(sigmaX)或通过x ^ n递增以SD为单位的n增量功率,但这些都不起作用。
我对这个概念有点困惑。
请告诉我如何按照预定义的比例缩放标准偏差,即我可能希望它比原始SD的1.34或3.78倍,并相应地将+ 3sigma放大到-3sigma跨度。
答案 0 :(得分:1)
你的计算:
F = (double) ((1/1)*exp(-sigmaX*(pow((step++)/1, 2.0)))) ;
不反映您展示的高斯公式。它应该是这样的:
double dSigma = 1.0;
static const double dRootTwoPi = sqrt(2.0 * M_PI);
F = (1.0 / (dSigma * dRootTwoPi)) * exp(-0.5 * pow(step++ / dSigma, 2.0));
然后你可以将dSigma
从1.0改为3.0(或其他)以获得你想要的效果。
答案 1 :(得分:1)
感谢Roger Rowland的帮助......我终于得到了这个工作:
将高斯函数更改为:
sigmaX*=scaling;
F = (double) ((scaling / (sigmaX))*exp(-0.0005*(powf((step++/sigmaX), 2.0)))) ;
事实上,我之前所做的并不完全是高斯。这可以很好地工作,并根据缩放参数进行缩放。
再次感谢。