我正在使用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);
}
}
线条几乎从图像的右下角开始,最后以图像右上角的略微曲线结束。为什么会这样?
答案 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
而不是......)
[附加编辑:我已经另外切换了参数,因此biWidth
和biHeight
分别位于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));
}
}