[英]How to find if a matrix is Singular in Matlab
我使用下面的函數為我的優化器生成一組給定的猜測lambda。
運行時,我經常會收到以下警告消息:
警告:Matrix的工作精度非常高。 在NSS_betas at 9 In DElambda at 19 In Individual_Lambdas at 36
我希望能夠從解決方案集中排除任何形成單個矩陣的beta,但我不知道如何測試它?
我一直在嘗試使用rcond(),但我不知道在奇異和非奇異之間切斷的位置?
當然,如果Matlab正在生成警告消息,它已經知道矩陣是否是單數,那么如果我能找到該變量的存儲位置,我可以使用它嗎?
function betas=NSS_betas(lambda,data)
mats=data.mats2';
lambda=lambda;
yM=data.y2';
nObs=size(yM,1);
G= [ones(nObs,1) (1-exp(-mats./lambda(1)))./(mats./lambda(1)) ((1-exp(-mats./lambda(1)))./(mats./lambda(1))-exp(-mats./lambda(1))) ((1-exp(-mats./lambda(2)))./(mats./lambda(2))-exp(-mats./lambda(2)))];
betas=G\yM;
r=rcond(G);
end
謝謝你的建議:
在將lambda值設置為相等以便設置單個矩陣之后,我測試了以下所有三個示例
if (~isinf(G))
r=rank(G);
r2=rcond(G);
r3=min(svd(G));
end
r = 3,r2 = 2.602085213965190e-16; r3 = 1.075949299504113e-15;
所以在這個測試中,rank()和rcond()工作假設我采用下面給出的基准值。
然而,當我有兩個接近但不完全相等的值時會發生什么?
我怎樣才能決定什么距離太近?
rcond
是去這里的正確方式。 如果它接近零的機器精度,你的矩陣是單數。 我經常跟:
if( rcond(A) < 1e-12 )
% This matrix doesn't look good
end
您可以嘗試一個滿足您需求的值,但是使用與MATLAB甚至接近單數的矩陣的逆矩陣可以產生垃圾結果。
你可以的結果比較rank(G)
與列數G
。 如果等級小於列維度,則將具有單個矩陣。
條件數(Maximal singular value/Minimal singular value)
是另一個好方法:
cond(A)
它使用svd
。 它應該盡可能接近1。 非常大的值意味着矩陣幾乎是單數。 Inf
意味着它恰好是單數。
請注意,其他答案中提到的幾乎所有方法都以某種方式使用svd
:
有針對此問題設計的特殊工具,適當地稱為“排名顯示矩陣因子分解”。 盡我所知(雖然有點舊)的知識,一個足夠好的方法來判斷nxn
矩陣A
是否是非奇異的是與
det(A) <> 0 <=> rank(A) = n
並使用A的排名顯示QR分解 :
AP = QR
其中Q
是正交的, P
是置換矩陣, R
是上三角矩陣,其特征在於對角元素的大小沿對角線減小。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.