gpt4 book ai didi

python - 非线性函数的 numpy 爱因斯坦求和

转载 作者:太空宇宙 更新时间:2023-11-03 20:38:18 30 4
gpt4 key购买 nike

我正在尝试设置以下非线性成本函数 (1) 和 (2) Imgur

通过使用 numpy einsum 函数。

我尝试将它们转换为 python,其中 R 是形状 (14,3,3) 和 vvt (表示等式 (1) 中的 v') 的形状为 (14,3)。 old_pointsnew_points 分别代表 pp',其形状为 (6890,3)。

def costfunc(x, old_points, new_points, weights, n_joints):
"""
Set up non-linear cost functions by using equations from LBS:
(1) p'_i = sum{j}(w_ji (R_j p_i + v_j))
(2) p_i - sum{j}(w_ji (R_j p'_i + v'_j))
where Rt denotes the transpose of R.
:param old_points: original vertex positions
:param new_points: transformed vertex positions
:param weights: weight matrix obtained from spectral clustering
:param n_joints: number of joints
:return: non-linear cost functions as in (1), (2) to find the root of
"""

# Extract rotations R, Rt and offsets v, v' from rv
R = np.array([(np.array(x[j * 15:j * 15 + 9]).reshape(3, 3)) for j in range(n_joints)])
Rt = np.array([R[j].T for j in range(n_joints)])
v = np.array([(np.array(x[j * 15 + 9:j * 15 + 12])) for j in range(n_joints)])
vt = np.array([(np.array(x[j * 15 + 12:j * 15 + 15])) for j in range(n_joints)])

## Use equations (1) and (2) for the non-linear pass.
# R_j p_i
Rp = np.einsum('jkl,il', R, old_points)
Rtv = np.einsum('jkl,il', Rt, v)
# Rt_j p'_i
Rtp = np.einsum('jkl,il', Rt, new_points)
Rvt = np.einsum('jkl,il', R, vt)

# w_ji (Rp_ij - Rtv_j)
wRpv = np.einsum('ji,ijk->ik', weights, Rp - Rvt)
# w_ji (Rtp'_ij - Rv'_j)
wRtpv = np.einsum('ji,ijk->ik', weights, Rtp - Rtv)

# Set up a non-linear cost function, then compute the squared norm.
d = new_points - wRpv
dt = old_points - wRtpv

norm = np.linalg.norm(d, axis=1)
normt = np.linalg.norm(dt, axis=1)

result = np.concatenate([norm, normt])

return np.power(result, 2)

现在,计算 wRpvwRtpv 的行中存在错误ValueError:操作数无法与形状 (6890,14,3) (14,14,3) 一起广播。我该如何解决这个问题?非常感谢任何帮助!

最佳答案

我现在明白了。这是解决方案:

def costfunc(x, old_points, new_points, weights, n_joints):
"""
Set up non-linear cost functions by using equations from LBS:
(1) p'_i = sum{j}(w_ji (R_j p_i + v_j))
(2) p_i - sum{j}(w_ji (R_j p'_i + v'_j))
where Rt denotes the transpose of R.
:param old_points: original vertex positions
:param new_points: transformed vertex positions
:param weights: weight matrix obtained from spectral clustering
:param n_joints: number of joints
:return: non-linear cost functions as in (1), (2) to find the root of
"""

# Extract rotations R, Rt and offsets v, v' from rv
R = np.array([(np.array(x[j * 15:j * 15 + 9]).reshape(3, 3)) for j in range(n_joints)])
Rt = np.array([R[j].T for j in range(n_joints)])
v = np.array([(np.array(x[j * 15 + 9:j * 15 + 12])) for j in range(n_joints)])
vt = np.array([(np.array(x[j * 15 + 12:j * 15 + 15])) for j in range(n_joints)])

## Use equations (1) and (2) for the non-linear pass.
# R_j p_i
Rp = np.einsum('jkl,il', R, old_points)
# Rt_j p'_i
Rtp = np.einsum('jkl,il', Rt, new_points)

# R_j v'_j
Rvt = np.array([R[i] @ vt[i] for i in range(n_joints)])
# Rt_j v_j
Rtv = np.array([Rt[i] @ v[i] for i in range(n_joints)])

# w_ji (Rp_ij - Rtv_j)
wRpv = np.einsum('ji,ijk->ik', weights, Rp - Rvt)
# w_ji (Rtp'_ij - Rv'_j)
wRtpv = np.einsum('ji,ijk->ik', weights, Rtp - Rtv)

# Set up a non-linear cost function, then compute the squared norm.
d = new_points - wRpv
dt = old_points - wRtpv

norm = np.linalg.norm(d, axis=1)
normt = np.linalg.norm(dt, axis=1)

result = np.concatenate([norm, normt])

return np.power(result, 2)

关于python - 非线性函数的 numpy 爱因斯坦求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57017071/

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