使用SIMD进行行列式计算

时间:2015-05-01 16:58:19

标签: sse simd neon

是否存在计算低维矩阵(约4)的行列式的方法,这种方法适用于SIMD(氖,SSE,SSE2)?我使用的是手动膨胀配方,效果不佳。我正在使用SSE一直到SSE3和霓虹灯,都在Linux下。矩阵元素都是浮点数。

1 个答案:

答案 0 :(得分:2)

这是我的5美分。

2x2矩阵的行列式:

这是读者的练习,应该很容易实现

3x3矩阵的决定因素:

使用标量三重产品。这需要智能cross()dot()实施。这些食谱广泛可用。

4x4矩阵的行列式:

使用here中的其中一项技巧。我的代码:

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 +矩阵的行列式:

可能会使用上面的技巧。