2011-10-09 92 views
5

我已經給了一個非常大的矩陣(我不能改變矩陣的值),我需要計算(協方差)矩陣的逆。det的矩陣在matlab中返回0

有時我得到的錯誤說

Matrix is close to singular or badly scaled. 
    Results may be inaccurate 

在這種情況下,我看到DET的值返回0

計算(的協方差矩陣)的逆之前,我想檢查值在DET並執行這樣的事情

covarianceFea=cov(fea_class); 
covdet=det(covarianceFea); 
if(covdet ==0) 
    covdet=covdet+.00001; 
    %calculate the covariance using this new det 
end 

有沒有辦法使用新DET,然後用它來計算的協方差矩陣的逆?

回答

1

在這種情況下,計算倒數並不是一個好主意。如果你只需要做到這一點,我會建議使用這種增加顯示精度:

format long; 

其他建議可能是嘗試使用矩陣的SVD和鼓搗周圍存在奇異值。

A = U∑V' 
inv(A) = V*inv(∑)*U' 

Σ是對角矩陣,你會看到對角的一個條目接近0試試,如果你需要某種近似的這一數字玩弄。

+0

有一個爲僞逆的PINV功能 – Amro

16

感嘆。計算行列式以確定奇點是一件荒謬的事情,完全如此。對於大型矩陣尤其如此。對不起,但是。爲什麼?是的,有些書告訴你這樣做。甚至可能是你的導師。

分析奇點是一回事。但是如何確定奇點的數值呢?除非您使用符號工具,否則MATLAB使用浮點運算。這意味着它將數字存儲爲浮點數,雙精度值。這些數字不能超過在幅度較小

>> realmin 
ans = 
    2.2251e-308 

(實際上,MATLAB比這低一點,在非規範化的數值,它可以深入到大約1E-323的條款。)看到,當我嘗試存儲比它小的數字,MATLAB認爲它是零。

>> A = 1e-323 
A = 
    9.8813e-324 

>> A = 1e-324 
A = 
    0 

大矩陣會發生什麼?例如,這是矩陣單數:

M = eye(1000); 

由於M是一個單位矩陣,它是相當明顯的非奇異的。事實上,det確實表明它是非單一的。

>> det(M) 
ans = 
    1 

但是,它乘以一些常數。這是否使它非單一?沒有!!!!!!!!!!!!!!!!!!!!!!!!當然不是。但無論如何都要嘗試。

>>  det(M*0.1) 
ans = 
    0 

嗯。那很奇怪。 MATLAB告訴我這個行列式是零。但我們知道行列式是1e-1000。哦,是的。天哪,1e-1000更小,比我剛纔告訴你的MATLAB可以存儲的最小數量要多一倍。因此,行列式下溢,儘管顯然非零。矩陣是單數嗎?當然不是。但是det的使用在這裏失敗了嗎?當然,這是完全可以預料的。

相反,使用一個很好的工具來確定奇點。使用像cond或rank這樣的工具。例如,我們可以欺騙排名嗎?

>> rank(M) 
ans = 
     1000 

>> rank(M*.1) 
ans = 
     1000 

見秩知道這是一個滿秩矩陣,不管我們是否擴大與否。 cond也是如此,計算M的條件數。

>> cond(M) 
ans = 
    1 

>> cond(M*.1) 
ans = 
    1 

歡迎來到浮點運算的世界。噢,順便說一下,忘記使用浮點運算幾乎所有計算的工具。這幾乎總是一個糟糕的選擇。

5

木片給了你一個很好的解釋,爲什麼你不應該使用行列式。這似乎是一個常見的誤解,你的問題與反轉矩陣上的另一個問題非常相關:Is there a fast way to invert a matrix in Matlab?,其中OP決定因爲他的矩陣的行列式爲1,所以它絕對是可逆的!下面是我的回答片段

不是det(A)=1,它是決定如何準確或穩定的逆將是condition number of your matrix。請注意,det(A)=∏i=1:n λi。所以只需設置λ1=M,λn=1/Mλi≠1,n=1就會給你det(A)=1。然而,由於M → ∞,cond(A) = M2 → ∞λn → 0,這意味着你的矩陣正在接近奇點,並且在計算逆矩陣時會出現大的數值誤差。

可以在MATLAB用下面簡單的例子測試:

A = eye(10); 
A([1 2]) = [1e15 1e-15]; 

%# calculate determinant 
det(A) 
ans = 

    1 

%# calculate condition number 
cond(A) 
ans = 

    1.0000e+30