我有一些使用 glm 进行向量和矩阵数学的函数和数据结构。
现在我想计算关于输入变量的梯度。由于计算相当复杂,我想使用自动微分来验证我的手动梯度计算。
我找到了https://autodiff.github.io/,这正是我所需要的。它的标量变量基于一个struct
包含 ashared_ptr
到一个表达式。我想使用glm::vec<2, autodiff::Variable<float>
, 和类似的矩阵,以及所有有趣的 glm 函数。
我已经开始移植代码,但我遇到了问题。例如glm::dot
包含支票
template<length_t L, typename T, qualifier Q>
GLM_FUNC_QUALIFIER GLM_CONSTEXPR T dot(vec<L, T, Q> const& x, vec<L, T, Q> const& y)
{
GLM_STATIC_ASSERT(std::numeric_limits<T>::is_iec559, "'dot' accepts only floating-point inputs");
return detail::compute_dot<vec<L, T, Q>, T, detail::is_aligned<Q>::value>::call(x, y);
}
我相信在这种情况下,将支票替换为std::numeric_limits<T>::is_iec559 || GLM_CONFIG_UNRESTRICTED_GENTYPE
(以及提出拉取请求)是安全的,但我不确定,我当然也不知道所有其他地方。
在包含 glm 之前,我已经定义了以下内容:
#define GLM_FORCE_PURE
#define GLM_FORCE_XYZW_ONLY
#define GLM_FORCE_UNRESTRICTED_GENTYPE
一起使用 glm 和 autodiff 是否现实?