如何在Matlab中求解矩阵的逆矩阵?

4
问题如下:
我有一组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,然后用较小的矩阵替换这些符号值。

到目前为止,我想出了一个解决方案。我将使用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)]

现在我可以将 A、B、C 和 D 替换为真实的 2x2 矩阵并计算出 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 都是矩阵,“*”表示点乘。


2
你能否将你的(慢)解决方案添加到问题中?也许可以基于该解决方案提高性能。你的较小矩阵有多大? - Daniel
1
注意:计算 inv(H)* R 不是高效的方法(如果 H 是秩缺失,甚至会失败)。通常的解决方案是解方程 - 例如使用 mldivide - 这通常写作 H\R - bdecaf
@bdecaf 我知道 mldivide 更快,但我不知道如何在方程中存在点乘积时应用它。如果我将所有较小的矩阵连接成一个更大的矩阵 H,则会起作用,但结果会出错。 - pewter_cauldron
1
你能否添加一个简单的示例(比如2x2矩阵)以及预期输出? - bdecaf
1
@bdecaf,我添加了一些示例。 - pewter_cauldron
显示剩余6条评论
1个回答

1
我找到了最好的解决方案来解决这组方程。实际上,它非常容易:只需要注意到这些方程可以重写成如下形式:
第一行第一个元素 = 第一行s1的第一个元素 × 第一行h1_1的第一个元素 + ...
这是由于方程中存在分段乘积的原因。现在每个r1到r20矩阵的元素都可以在循环(或并行循环)中独立解决。感谢大家的帮助。

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