gpt4 book ai didi

python - Python 中的 Matlab lsqnonlin

转载 作者:行者123 更新时间:2023-12-03 19:50:56 27 4
gpt4 key购买 nike

我一直在研究 Hartley 和 Zisserman 多 View 几何文本,并实现了用于计算基本矩阵的黄金标准算法。这需要使用 Levenberg-Marquardt 解决非线性最小化问题。
我用 scipy.optimize.least_squares 实现了这个,但性能比使用 lsqnonlin 的类似(例如,相同功能)matlab 代码慢几个数量级.在这两种情况下,我都没有提供雅可比矩阵或雅可比矩阵稀疏性的掩码。
关于计算时间,这适用于可用的 scipy 求解器范围。我想知道是否存在与 matlab 具有相似性能(数值和速度)的替代方案,或者是否需要转移到包装的编译求解器?
编辑代码请求注释。我试图限制插入的代码总量。
MATLAB:

P2GS = lsqnonlin(@(h)ReprojErrGS(corres1,PF1,corres2,h),PF2); 

function REGS = ReprojErrGS(corres1,PF1,corres2,PF2)
%Find estimated 3D point by Triangulation method
XwEst = TriangulationGS(corres1,PF1,corres2,PF2);
%Reprojection Back to the image
x1hat = PF1*XwEst;
x1hat = x1hat ./ repmat(x1hat(3,:),3,1);
x2hat = PF2*XwEst;
x2hat = x2hat ./ repmat(x2hat(3,:),3,1);
%Find root mean squared distance error
dist = ((corres1 - x1hat).*(corres1 - x1hat)) + ((corres2 - x2hat).* (corres2 - x2hat));
REGS = sqrt(sum(sum(dist)) / size(corres1,2));
三角剖分是标准方法,迭代所有点,设置 Ax=0 并使用 SVD 求解。
Python:
# Using 'trf' for performance, swap to 'lm' for levenberg-marquardt
result = optimize.least_squares(projection_error, p1.ravel(), args=(p, pt.values, pt1.values), method='trf')
# Inputs are pandas dataframe, hence the .values

# Triangulate the correspondences
xw_est = triangulate(pt, pt1, p, p1)
# SciPy does not like 2d multi-dimensional variables, so reshape

if p1.shape != (3,4):
p1 = p1.reshape(3,4)

xhat = p.dot(xw_est).T
xhat /= xhat[:,-1][:,np.newaxis]
x2hat = p1.dot(xw_est).T
x2hat /= x2hat[:,-1][:,np.newaxis]
# Compute error
dist = (pt - xhat)**2 + (pt1 - x2hat)**2
reproj_error = np.sqrt(np.sum(dist, axis=1) / len(pt))
# print(reproj_error)
return reproj_error
这应该完全矢量化。三角剖分如上。我可以补充一点,但可能会链接一个要点以保持问题大小的可管理性。

最佳答案

least_squares很新。截至 2015 年秋季,SciPy 领域没有其他选择。否则,有例如谷神星。

肯定有很多加速的机会least_squares --- 很高兴接受拉取请求:-)。首先要检查的是,SciPy 是否与一个不错的 LAPACK 实现相关联。

关于python - Python 中的 Matlab lsqnonlin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37211334/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com