如何反转一个 3x3 矩阵,每个元素都是一个 3x3 矩阵?

Posted

技术标签:

【中文标题】如何反转一个 3x3 矩阵,每个元素都是一个 3x3 矩阵?【英文标题】:How to invert a 3x3 matrix with each element being a 3x3 matrix? 【发布时间】:2011-02-04 21:32:59 【问题描述】:

我正在尝试在 C++ 中实现用于数据融合的卡尔曼滤波器。作为项目的一部分,我需要实现一个函数来计算一个 3x3 矩阵的逆矩阵,该矩阵的每个元素本身都是一个 3x3 矩阵。你能帮我解决这个问题吗?我更喜欢需要最少计算量(CPU 效率最高)的解决方案。

还有一个问题,既然卡尔曼滤波器依赖于逆矩阵,那么当矩阵不可逆的情况下应该如何处理呢?

感谢您的帮助。

【问题讨论】:

在编写计算机函数之前,您需要一个数学描述。你有数学算法吗? 是否甚至可以反转矩阵矩阵?我真的很想知道......我看到的唯一可能的事情是反转每个子矩阵,但真的不知道这是否有任何好处。 @Xeo:好点...我想人们可以用 3x3 单位矩阵识别“1”,用 3x3 零矩阵识别“0”,分别用矩阵加法和乘法识别 + 和 *。但是矩阵乘法不是可交换的,所以我不知道代数是否可行。但这让我想知道,在这种情况下,将 Tuan 的结构视为 9x9 实数矩阵,然后将其反转是否有意义。 @Jim:嗯,这取决于 Tuan 需要整个矩阵还是只需要子矩阵......因为我真的想不出你需要矩阵的任何情况的矩阵。如果他需要整个矩阵,那么我想将其视为 9x9 矩阵会起作用。 @aschepler:我正在尝试使用该算法使用行列式 (det) 反转 3x3 矩阵,并将每个子矩阵视为一个数字,但它不起作用。由于每个元素都是一个矩阵,因此行列式结果是一个矩阵而不是一个数字。 【参考方案1】:

你可以做一个“小矩阵”,它是一个“大矩阵”的每个元素,其中包含指向“小矩阵”的指针,因此反转“大矩阵”将花费与反转整数的正常矩阵一样长的时间.

这可能是你能做的最快的算法,但它适合你的实现吗?你的矩阵是如何声明的?

【讨论】:

我的矩阵的实现类似于你的想法,大矩阵包含指向小矩阵的指针。然后我使用算法对它进行逆运算,以反转一个 3x3 实数矩阵,但看起来它不正确。谢谢。 @Tuan Nguyen:所以你没有遇到任何类型的运行时/编译时错误?调试器说什么? 不,程序编译并运行良好。然而,在再次阅读卡尔曼滤波器文档时,我意识到小的 3x3 矩阵在更大的矩阵中被视为“块”。所以总的来说,大矩阵只是像上面建议的 Jim 和 Xeo 那样的常规 9x9 矩阵。

以上是关于如何反转一个 3x3 矩阵,每个元素都是一个 3x3 矩阵?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 c# 中从 3x3 单应矩阵获取旋转、平移、剪切

如何在 C++ 中构建 3x3 平移矩阵

C++ 中的 3x3 矩阵旋转

29.求3x3的整数矩阵对角线元素之和

如何在 C++ 中编写 3x3 矩阵梯度?

算法33---矩阵中的幻方