我想计算一个超定义平面(> 3个点)的梯度(方向和大小),例如四个x,y,z坐标:
[0,0,1],[1,0,0],[0,1,1],[1,1,0]
我用于计算梯度的代码如下(使用this post的奇异值分解,已修改):
import numpy as np
def regr(X):
y = np.average(X, axis=0)
Xm = X - y
cov = (1./X.shape[0])*np.matmul(Xm.T,Xm) # Covariance
u, s, v = np.linalg.svd(cov) # Singular Value Decomposition
return u[:,1]
但是我得到了:
[0,1,0]
既不代表梯度也不代表法线向量。结果应如下所示:
[sqrt(2)/ 2,0,-sqrt(2)/ 2]
有什么主意为什么我得到错误的向量吗?
答案 0 :(得分:1)
您可以为此使用功能numpy.gradient。这是math background的工作方式。
简而言之:
方向导数将是梯度与方向(单位归一化)矢量的点积。
一个更简单的解决方案是使用numdifftools,尤其是便捷功能directionaldiff。 可以找到一个示例here。而且,如果您查看source code,就会发现与上述数学的关系。