使用SIMD进行行列式计算

5

是否存在一种适用于低维矩阵(约4)的行列式计算方法,可与SIMD(neon、SSE、SSE2)很好地配合使用?我正在使用手动展开公式,但效果不太好。我在Linux下使用SSE3和neon,矩阵元素全部为浮点数。


2
这个任务必须按顺序完成,还是可以计算多个独立的行列式(例如四个4x4的行列式)? - Z boson
1
你还需要更具体地说明你想要什么规格。你是想要恰好4x4的尺寸,还是想要2x2、3x3和4x4的尺寸?你所说的“(大约4)”是什么意思? - Z boson
1
好的,我们正在取得进展。所以你需要一个4x4矩阵的逆,并且你想用SIMD来实现。但我需要更多的信息。你为什么需要这个逆矩阵?是为了解决线性系统吗?因为在这种情况下,你可能不一定需要那个逆矩阵。 - Z boson
2
在这种情况下,我认为你应该编辑你的问题(和标题),说明你想要使用 SSE 确定一个 4x4 矩阵的逆,或者提出一个新的问题。此外,您需要说明这是浮点数还是双精度,并且您正在使用什么编译器和操作系统。 - Z boson
2
矩阵的任何其他属性都是有趣的。例如,它是否对称?正定的吗?这是一个仿射变换吗? - Z boson
显示剩余7条评论
1个回答

3

以下是我的建议。

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

可能需要使用上面的技巧。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接