为了求解矩形线性系统Ax=b
,其中A=mxn
和n>m
Mtlab首先执行QR分解,然后通过替换求解三角形线性系统。例如:
如果A
是4*6
矩阵:
A =
0.8147 0.9058 0.1270 0.9134 0.6324 0.0975
0.2785 0.5469 0.9575 0.9649 0.1576 0.9706
0.9572 0.4854 0.8003 0.1419 0.4218 0.9157
0.7922 0.9595 0.6557 0.0357 0.8491 0.9340
和
b=
-0.9661
0.1590
-0.0391
-0.2491
解决Ax=b
我们只是这样做:
x=A\b;
,解决方案是:
x =
-0.4284
-0.6475
0
-0.1153
0
0.7662
此计算中的以下步骤是:
Ax=b
相当于Q*R*x=b
; inv(Q)=Q'
而R是上三角形,解决系统将返回求解R*x=b1
b1=Q'*b;
由于R
是大小为6*4
的上三角形,我们必须执行反向替换。知道R不是方形的,Mtlab如何进行反向替换?
我正在将此计算移植到C并成功完成它直到R * x = b1,我在后面替换时丢失了,我想找到与Matlab相同的结果
修改
对于上面的矩阵A
:
解决Ax=b
等同于解决Rx=b1
其中:
R =
-1.5117 -1.3991 -1.0952 -0.7786 -1.0819 -1.3007
0 -0.5641 -0.2197 -0.6538 -0.2920 -0.2481
0 0 -0.8692 -0.2077 0.1422 -0.9295
0 0 0 -0.8426 0.2182 0.2125
和
b1 =
-0.9661
0.1590
-0.0391
-0.2491
这个系统是通过反向替换来解决的,因为R
是上三角形,这在方形三角矩阵(即m = n)的情况下是直接的,但是,R
不是正方形,如何Matlab执行反向替换以查找x
?
答案 0 :(得分:1)
MATLAB如何详细实现只有Mathworks知道的欠定情况!但是你可以这样做的方法如下。
A*x = b
A' = Q*R
现在,如果你看看R,你会得到一些形式
R = [R1; zeros]
其中R1是正方形。
您可以将解决方案表达为:
x = Q * [inv(R1')*b; zeros]
因为你表明你已经解决了反转方形矩阵的问题,这应该很容易:)
答案 1 :(得分:1)
所以我不能100%确定MATLAB的功能,但我可以告诉你以下内容:
对于您的欠定矩阵A(nxm),我们可以采用A' = QR。我们也看到A = R' Q'。请注意,现在,R有n个非零行。然后我们可以通过识别R' Q< x = b,然后Q' x = inv(R')* b来解决系统问题。 RHS可以通过反向替换来解决,我们称之为y。所以Q' x = y。但Q是自我Hermitian,所以x = Qy。你有最小二乘解决方案。
在MATLAB中这样做我们得到:
>> A'*inv(A*A')*b
ans =
-0.4256
-0.3057
0.3568
-0.2745
-0.2823
0.4249
我在R' \ b上面使用了反斜杠,但很清楚,你可以在自己的日常工作中替代。
我们可以通过使用A:
的伪逆来计算解决方案来验证这一点std::cout
您可以轻松地检查这是一个有效的解决方案。这应该很容易在C中实现。
希望这会有所帮助。