从这个问题
Finding the best trade-off point on a curve
我使用的是Python解决方案,如果我自己运行的话,效果会很好。你知道吗
但我有一本关于这些“曲线”的字典:
sse{}
{'00': [4.998436383771836,
0.0160165895672664,
0.004512422186993107,
0.0013171501024742112,
0.000788783358847752,
0.0005498425886621068],
'67':[0.13598930783101504,
0.04717783658889547,
0.027547125931827038,
0.021440839841617088,
0.016775671441391703,
0.013185864754748117,
0.010318462898609907],
等等。。。你知道吗
如果我运行这个,它工作得很好:
curve = sse['67']
nPoints = len(curve)
allCoord = np.vstack((range(nPoints), curve)).T
np.array([range(nPoints), curve])
firstPoint = allCoord[0]
lineVec = allCoord[-1] - allCoord[0]
lineVecNorm = lineVec / np.sqrt(np.sum(lineVec**2))
vecFromFirst = allCoord - firstPoint
scalarProduct = np.sum(vecFromFirst * np.matlib.repmat(lineVecNorm, nPoints, 1), axis=1)
vecFromFirstParallel = np.outer(scalarProduct, lineVecNorm)
vecToLine = vecFromFirst - vecFromFirstParallel
distToLine = np.sqrt(np.sum(vecToLine ** 2, axis=1))
idxOfBestPoint = np.argmax(distToLine)
print(idxOfBestPoint)
但是,当我试图使它成为一个循环函数时,我得到了奇怪的值,这些值在单独运行时不匹配:
for k in sse:
curve = sse[str(k)]
nPoints = len(curve)
allCoord = np.vstack((range(nPoints), curve)).T
np.array([range(nPoints), curve])
firstPoint = allCoord[0]
lineVeceVeceVec = allCoord[-1] - allCoord[0]
lineVecNorm = lineVec / np.sqrt(np.sum(lineVec**2))
vecFromFirst = allCoord - firstPoint
scalarProduct = np.sum(vecFromFirst * np.matlib.repmat(lineVecNorm, nPoints, 1), axis=1)
vecFromFirstParallel = np.outer(scalarProduct, lineVecNorm)
vecToLine = vecFromFirst - vecFromFirstParallel
distToLine = np.sqrt(np.sum(vecToLine ** 2, axis=1))
idxOfBestPoint = np.argmax(distToLine)
print(idxOfBestPoint, k)
它会吐出这样的东西:
7 57
98 11
6 45
4 50
98 91
98 00
1 62
98 79
7 48
98 12
98 38
98 23
5 37
98 56
98 67
5 25
7 46
98 22
98 49
2 47
98 41
98 78
98 35
98 68
98 14
98 24
1 0
98 42
我不知道是否有某个变量没有重置,或者是什么原因通过添加一个简单的循环导致它失败?你知道吗
很明显,它确实运行了,但是calc将'98'作为循环的弯头,但是单独运行时,对于'67'曲线列表,它将是7,而不是98。你知道吗
您输入了一个错误:
lineVeceVeceVec = allCoord[-1] - allCoord[0]
。它应该是lineVec = allCoord[-1] - allCoord[0]
。所以你所说的是lineVec
最后一次被赋值给一个结果,最后一个值可能是你运行非循环版本时的值。你知道吗相关问题 更多 >
编程相关推荐