如何在Matlab中反转矩阵矩阵?

Posted

技术标签:

【中文标题】如何在Matlab中反转矩阵矩阵?【英文标题】:How to invert a matrix of matrices in Matlab? 【发布时间】:2015-07-23 08:57:35 【问题描述】:

问题如下: 我有一组 20 个方程:

r1 = s1*h1_1 + s2*h1_2 + ... s20*h1_20

r2 = s1*h2_1 + ...

...

r20 = s1*h20_1 + ...

其中 r、s 和 h 是矩阵,* 表示 逐点积。 它可以改写为矩阵形式 R = H*S。我想为 S 解这个方程 - 所以我需要计算 inv(H)*R。但是,如果 H 的每个元素都是矩阵,我该如何计算 inv(H) 呢?我不能简单地将这些 较小的矩阵 连接成一个更大的矩阵 H 然后将其反转 - 因为这将给出不同的结果,例如用符号值反转矩阵 H,然后用 更小的矩阵 替换这些符号值(因为方程组中存在逐点积)。

到目前为止,我想出了 1 个解决方案。我将创建具有 20x20 符号值的矩阵 H,我将其反转,然后我将使用“subs”评估生成的反转矩阵的每个单元格。

H = sym('A',[20 20]);
invmat = inv(H) ;
% here I load 400 smaller matrices with appropriate names
invmat_11 = subs(invmat(1,1));

但是这种矩阵的求逆在任何中级计算机上都非常复杂,因此我从未设法运行此代码。您知道计算矩阵 H 求逆或直接求解 S 的任何其他方法吗?

有人问我一些简单的例子: 考虑方程 R = H*S(S 未知)。假设 H=[A B; C D],其中 A,B,C,D 是 2x2 矩阵,例如 A = [A11 A12; A21 A22]

并且 R 和 S 是 2x1 矩阵,例如

R = [R1;R2]

要计算 S,我需要求解 inv(H)*R,符号为 inv(H) =

[ -D/(B*C - A*D), B/(B*C - A*D)] [ C/(B*C - A*D), -A/(B*C - A*D)]

现在我可以用真正的 2x2 矩阵替换 A、B、C 和 D 并计算 H 的求逆:

inv(H) = [H1 H2; H3 H4]

H1 = -D/(B*C - A*D)

这构成了 inv(H) 的计算。 现在我需要将 inv(H) 与 R 相乘(求解 S):

S1 = H1*R1 + H2*R2 S2 = H3*R1 + H4*R2

但请注意,所有 H1 到 H4 和 R1 到 R2 都是矩阵,* 表示逐点积。

【问题讨论】:

您能否将您的(缓慢)解决方案添加到问题中。也许性能可以提高偏向于该解决方案。你的小矩阵有多大? 请注意 - 计算 inv(H)*R 效率不高(如果 H 排名不足,甚至会失败)。通常的解决方案是求解方程 - 例如。使用mldivide - 简写为H\R @Daniel,我的缓慢解决方案已经存在问题:我的计算机从未设法计算 H = sym('A',[20 20]); invmat = inv(H);我什至尝试应用块反转(en.wikipedia.org/wiki/Invertible_matrix#Blockwise_inversion),这样我只需要计算 10x10 矩阵反转 - 但这仍然会消耗内存。 您能否添加一个具有预期输出的简单示例(例如 2x2 矩阵)? @bdecaf 我添加了一些例子。 【参考方案1】:

我找到了解决这组方程的最佳解决方案。实际上,这非常简单:只需注意这些方程可以改写为以下形式:

first_element_of_r1 = first_element_ofs1*first_element_of_h1_1 + ...

这是由于方程中存在分段积。现在 r1 到 r20 矩阵的每个元素都可以在循环(或并行循环)中独立求解。感谢大家帮助我。

【讨论】:

以上是关于如何在Matlab中反转矩阵矩阵?的主要内容,如果未能解决你的问题,请参考以下文章

在matlab中,如何将struct类型转化为矩阵类型?

在matlab中如何求两个列矩阵的协方差?

Matlab如何在matlab利用plotconfusion中绘制混淆矩阵

matlab中如何向矩阵中添加元素

请问在MATLAB中,如何计算含有未知数的矩阵?

matlab如何在matlab利用plotconfusion中绘制混淆矩阵