【问题标题】:determinant calculation with SIMD使用 SIMD 进行行列式计算
【发布时间】:2015-07-11 13:13:30
【问题描述】:

是否存在一种计算低维(约 4)矩阵行列式的方法,该方法适用于 SIMD(霓虹灯、SSE、SSE2)?我正在使用手动扩展公式,效果不太好。我在 linux 下一直使用 SSE 到 SSE3 和 neon。矩阵元素都是浮点数。

【问题讨论】:

  • 这是否必须按顺序完成,或者您可以计算多个独立的确定(例如四个 4x4 确定)。
  • 您还需要更具体地确定您想要什么。您到底想要 4x4 还是想要 2x2、3x3 和 4x4? “(大约 4 个)”是什么意思?
  • 你能解释更多你想要做什么。你在解决什么线性系统?也许您可以发布一些代码?
  • 在这种情况下,我认为您应该编辑您的问题(和标题),说明您想用 SSE 确定 4x4 矩阵的逆矩阵,或者提出一个新问题。您还需要说明这是浮点数还是双精度数,以及您使用的编译器和操作系统。
  • 矩阵的任何其他属性也会很有趣。例如。它是对称的吗?肯定的?这是仿射变换吗?

标签: sse simd neon determinants


【解决方案1】:

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

可能会使用上面的技巧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 2020-06-16
    • 2015-04-15
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多