误差函数的效率 - 最小化问题
efficiency of error function - minimization problem
我写了一个函数来计算每个像素的误差,基于图像的坐标和颜色(np 数组)。
基本上是这样的:
def checkPoints(i, j, x_left, y_top):
errormap = {}
for row in possibleMap[i][j]:
for target in row:
x,y = target
dE = np.sqrt((x-i)**2 + (y-j)**2)*dE_fac #distance
sE = ((skalarError((i>0)*(x - x_mapping_left)) + skalarError((j>0)*(y - y_mapping_top)))*sE_fac)**sE_exp #direction with respect to neighbouring pixels
cE = abs(color - pic_tomap[x,y])*cE_fac # color difference
errormap[dE + sE + cE + mE] = [x,y] # a dictionary... keys: ErrorValue, values: coordinates
return errormap
possibleMap 是一个 npArray,它包含坐标元组
*_fac, *_exp 只是常量
x_mapping_left 是 i-1 除了当 i=0 时,它是 0(y_mapping_left 与 j 相应)
现在我想知道一些事情,因为我想要我能得到的最大效率。
我可以使用 map-function 遍历 possibleMap,还是 map-function 仅适用于一维循环?
因为我不需要 errormap 本身,而只需要最少的 ErrorValue 和相关的坐标,有没有比上面的代码更有效的方法:
errormap[min(errormap.keys())]
- 我恳请任何想法以获得更好的性能
我最近发现,这一点:
sE = ((skalarError((i>0)*(x - x_mapping_left)) + skalarError((j>0)*(y - y_mapping_top)))*sE_fac)**sE_exp
在性能方面是毁灭性的,因为这些:
(i>0)
(j>0)
正在消耗大量时间..
我不知道为什么,但是当我用 if then else 语句交换它们时,它快了将近 2 倍 (:
我写了一个函数来计算每个像素的误差,基于图像的坐标和颜色(np 数组)。
基本上是这样的:
def checkPoints(i, j, x_left, y_top):
errormap = {}
for row in possibleMap[i][j]:
for target in row:
x,y = target
dE = np.sqrt((x-i)**2 + (y-j)**2)*dE_fac #distance
sE = ((skalarError((i>0)*(x - x_mapping_left)) + skalarError((j>0)*(y - y_mapping_top)))*sE_fac)**sE_exp #direction with respect to neighbouring pixels
cE = abs(color - pic_tomap[x,y])*cE_fac # color difference
errormap[dE + sE + cE + mE] = [x,y] # a dictionary... keys: ErrorValue, values: coordinates
return errormap
possibleMap 是一个 npArray,它包含坐标元组
*_fac, *_exp 只是常量
x_mapping_left 是 i-1 除了当 i=0 时,它是 0(y_mapping_left 与 j 相应)
现在我想知道一些事情,因为我想要我能得到的最大效率。
我可以使用 map-function 遍历 possibleMap,还是 map-function 仅适用于一维循环?
因为我不需要 errormap 本身,而只需要最少的 ErrorValue 和相关的坐标,有没有比上面的代码更有效的方法:
errormap[min(errormap.keys())]
- 我恳请任何想法以获得更好的性能
我最近发现,这一点:
sE = ((skalarError((i>0)*(x - x_mapping_left)) + skalarError((j>0)*(y - y_mapping_top)))*sE_fac)**sE_exp
在性能方面是毁灭性的,因为这些:
(i>0)
(j>0)
正在消耗大量时间.. 我不知道为什么,但是当我用 if then else 语句交换它们时,它快了将近 2 倍 (: