是否存在一种适用于低维矩阵(约4)的行列式计算方法,可与SIMD(neon、SSE、SSE2)很好地配合使用?我正在使用手动展开公式,但效果不太好。我在Linux下使用SSE3和neon,矩阵元素全部为浮点数。
是否存在一种适用于低维矩阵(约4)的行列式计算方法,可与SIMD(neon、SSE、SSE2)很好地配合使用?我正在使用手动展开公式,但效果不太好。我在Linux下使用SSE3和neon,矩阵元素全部为浮点数。
以下是我的建议。
2x2矩阵行列式:
这是一个读者练习,应该很容易实现。
3x3矩阵行列式:
使用标量三重积。这将需要智能 cross()
和 dot()
实现。这些操作的代码可以在许多地方找到。
4x4矩阵行列式:
使用这里的其中一种技巧。我的代码:
template <class T>
inline T det(matrix<T, 4, 4> const& m) noexcept
{
auto const A(make_matrix<T, 2, 2>(m(0, 0), m(0, 1), m(1, 0), m(1, 1)));
auto const B(make_matrix<T, 2, 2>(m(0, 2), m(0, 3), m(1, 2), m(1, 3)));
auto const C(make_matrix<T, 2, 2>(m(2, 0), m(2, 1), m(3, 0), m(3, 1)));
auto const D(make_matrix<T, 2, 2>(m(2, 2), m(2, 3), m(3, 2), m(3, 3)));
return det(A - B * inv(D) * C) * det(D);
}
一个5x5+矩阵的行列式:
可能需要使用上面的技巧。