Sigmoid曲线不适用于公式C ++

时间:2012-01-31 00:53:33

标签: c++ image math pixel curve

我正在使用Microsoft Visual Studio 2010。

公式为y = 1/(1+exp(-e))

在bih.biWidth是要迭代的范围的值范围内。

然而,当我尝试在代码中实现它不起作用时,为什么?任何专家都可以指导我,谢谢。

for(int y=0; y<bih.biHeight; y++) 
{ 
   for(int x=0; x<bih.biWidth; x++) 
   {   
      SetPixel(hdc, (double)1/((double)1+exp(double(-x)))*bih.biWidth, 
               bih.biHeight-x, red); 
   } 
} 

线条几乎从图像的右下角开始,最后以图像右上角的略微曲线结束。为什么会这样?

2 个答案:

答案 0 :(得分:2)

因为0是S形曲线的中心。你的x从0开始;如果希望曲线对称绘制,则需要计算一个关于0的对称参数:

for(int x=0; x<bih.biWidth; x++)
{
    double a= x - 0.5*bih.biWidth;
    SetPixel(hdc, bih.biWidth-x, 1.0/(1.0+exp(-a)) * bih.biHeight, red);
}

按常数因子缩放a将调整sigmoid函数的斜率。

(我还怀疑你的原始代码已经切换了SetPixel()参数中使用的缩放因子,所以我已经修复了这个问题。从x减去bih.biHeight是没有意义的。它的范围从0到bih.biWidth而不是......)

[附加编辑:我已经另外切换了参数,因此biWidthbiHeight分别位于x坐标和y坐标中。无论如何,这是绘制函数的传统方法 - 所以如果你想翻转图,你需要将其切换回来]

答案 1 :(得分:1)

以下是您尝试做的惯用代码:

double f(double x) { return 1.0 / (1.0 + exp(-x)); }

void draw_graph(HDC hdc, BITMAPINFOHEADER bih, RECTF graph_bounds)
{
    double graph_x, graph_y = f(graph_bounds.left);
    MoveToEx(hdc, 0, bih.biHeight * (1 - (graph_y - graph_bounds.bottom) / (graph_bounds.top - graph_bounds.bottom), NULL);
    for(int x=1; x<bih.biWidth; x++) {
       graph_x = graph_bounds.left + (graph_bounds.right - graph_bounds.left) * x / bih.biWidth;
       graph_y = f(graph_x);
       LineTo(hdc, x, bih.biHeight * (1 - (graph_y - graph_bounds.bottom) / (graph_bounds.top - graph_bounds.bottom));
    }
}