如何在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中反转矩阵矩阵?的主要内容,如果未能解决你的问题,请参考以下文章