2012-07-11 62 views
3

我有一個399 x 399的矩陣,R svd()函數(使用LAPACK)給了我一個負奇異值!這不應該發生 - 有沒有人看過這個?如果我使用LINPACK選項,則不會發生這種情況,所以我猜這是LAPACK svd中的一個錯誤。使用LAPACK的負奇異值svd

ganymede: R --vanilla 

R version 2.15.1 (2012-06-22) -- "Roasted Marshmallows" 
Copyright (C) 2012 The R Foundation for Statistical Computing 
ISBN 3-900051-07-0 
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit) 

R is free software, etc ... 

> load('A.dat') 
> ls() 
[1] "A" 
> dim(A) 
[1] 399 399 
> 
> L1 <- svd(A) 
> any(L1$d < 0) 
[1] TRUE 
> L1$d[1:4] 
[1] 80.18833 68.93905 61.62659 57.62883 
> L1$d[396:399] 
[1] 3.777844e-15 3.582460e-15 3.175665e-15 -6.512578e+00 
> 
> L2 <- svd(A,LINPACK=TRUE) 
> any(L2$d < 0) 
[1] FALSE 
> L2$d[1:4] 
[1] 80.18833 68.93905 61.62659 57.62883 
> L2$d[396:399] 
[1] 8.565532e-32 3.254162e-32 3.484425e-47 5.411232e-48 
> 
+4

[此錯誤報告](https://bugs.r-project.org/bugzilla3/show_bug.cgi?id=14962)是否適用於您的問題? – Roland 2012-07-11 20:02:21

+0

我認爲它的確如此。建議的修復方法是與LAPACK 3.4.1鏈接,而不是默認的3.1.1。我必須嘗試一下。非常感謝你。 – 2012-07-11 20:42:04

+1

@羅蘭:謹慎地補充說,作爲一個答案,假設它是羅伯特問題的解決方案? – 2012-07-11 21:15:08

回答

0

根據this bug report該問題很可能通過重新鏈接LAPACK來解決3.4.1。升級通用版本3.1.1似乎是不平凡的,並且該過程取決於操作系統。