我有一个矩阵D,它是m * n,我使用公式inv(D'* D)* D'计算伪逆,但它没有产生与pinv(D)相同的结果。我需要术语inv(D'* D),我需要进行增量操作。我的所有准确度取决于inv(D'* D),这是不正确的。有没有其他方法可以准确地获得inv(D'* D)?有人可以帮我吗?
%D是我从一个博客复制的3x4矩阵,仅用于演示目的。实际上我的一个也有同样的问题,它的大小太大,我不能在这里发布。
D = -[1/sqrt(2) 1 1/sqrt(2) 0;0 1/sqrt(2) 1 1/sqrt(2);-1/sqrt(2) 0 1/sqrt(2) 1];
B1 = pinv(D)
B2 = D'*inv(D*D')
B1 =
-0.353553390593274 0.000000000000000 0.353553390593274
-0.375000000000000 -0.176776695296637 0.125000000000000
-0.176776695296637 -0.250000000000000 -0.176776695296637
0.125000000000000 -0.176776695296637 -0.375000000000000
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND =
1.904842e-017.
B2 =
-0.250000000000000 0 0.500000000000000
-0.500000000000000 0 0
0.250000000000000 -0.500000000000000 0
0 0 -0.750000000000000
我需要inv(D'D)来进行增量操作。实际上在我的步骤1的问题中,每次将新行添加到D的最后位置,并且在步骤2中,将删除D的第一行。所以我想使用我在这两个步骤之前计算的逆来找到最终的D逆。更确切地说,看看这里:
B = inv(D'*D); % if i can calculate it accurately then further work is as follows
D1 = [D;Lr]; %Lr is last row to be added
BLr = B-((B*Lr'*Lr*B)/(1+Lr*B*Lr')); % Row addition formula
Fr = D1(1,:); % First row to be removed
D2 = removerows(D1,1);
BFr = BLr+ ((BLr*Fr'*Fr*BLr)/(1-Fr*BLr*Fr')); % row deletion formula
B = BFr;
Y = BFr*D2;
答案 0 :(得分:4)
您用于Moore-Penrose伪逆的公式(D ^ TD)^ - 1 D ^ T或D ^ T(DD ^ T)^ - 1仅在D具有完整列或满行排名时才有效,分别。
在您的情况下不是这样,因为警告“矩阵接近单数”显示。
matlab pinv命令适用于任意D,即使矩阵既没有完整行列也没有完整列级别。
答案 1 :(得分:1)
尝试在矩阵上运行cond(D)
,看看condition number是什么。数字越大,矩阵的病态就越多。同样,您可以运行cond(D'*D)
。矩阵可以是满级并且仍然是病态的。在纸面上,病态矩阵仍然是可逆的。但是,当您尝试在计算机上直接反转病态矩阵时,由量化和其他效应引起的小精度误差可能会导致解决方案中出现非常不可预测的结果。
由于上述原因,通常有一种更好的方法(数值更稳定)来实现你所追求的,而不是直接计算逆。其中许多涉及矩阵分解技术,如SVD。如果您帮助我们了解为什么您需要inv(D'*D)
,那么将您指向适当的替代方向会更容易。例如,如果您只需要伪逆,请继续使用pinv()
,即使它与使用inv()
的结果不同。 pinv()
函数和\ (mldivide)
backslash operator是比inv()
更加数值稳定的工具。
答案 2 :(得分:0)
请参阅http://www.mathworks.com/help/matlab/ref/pinv.html上的官方文档。
如果A x~b,解x = pinv(A) * b
产生最小范数解,但x = A\b
不产生。class IncidentForm(forms.ModelForm):
technician = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple(), queryset=User.objects.all())
class Meta:
model = Incident
fields = [
'technician',
'capa',
]
。请参阅上面链接中的数字示例。