簡體   English   中英

如何在Matlab中找到矩陣是否是奇異的

[英]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 如果等級小於列維度,則將具有單個矩陣。

你也可以通過以下方式檢查:

min(svd(A))>eps

並驗證最小的奇異值是否大於eps,或任何其他與您的需求相關的數值公差。 (代碼將返回1或0)

這是關於它的更多信息 ......

條件數(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM