2009-06-02 32 views
6

Bir varyans matrisinin köşegen olup olmadığını test etmem gerekiyor. Değilse, Cholesky LDL ayrıştırması yapacağım. Ama en güvenilir ve en hızlı yolun matris diyagonal olup olmadığını merak ediyordum? Fortran kullanıyorum.Matrisin köşegen olup olmadığını nasıl test edebilirim?

Aklıma gelen ilk şey, matrisin tüm unsurlarını toplamalı ve bu toplamdan çapraz elemanlar ayırmaktır. Cevap 0 ise matris diyagonaldir. Daha iyi bir fikir var mı?

Fortranda yılında

Ben Onlar sıfıra yakın ise sadece eşitsizlik için bir kayan nokta sayısı eğilimli karşılaştırarak (bütün çapraz kapatma elemanları ve testi çapraz çok daha iyi olurdu

!A is my matrix 
k=0.0d0 
do i in 1:n #n is the number of rows/colums 
k = k + A(i,i) 
end do 

if(abs(sum(A)-k) < epsilon(k)*sum(A)) then 
#do cholesky LDL, which I have to write myself, haven't found any subroutines for that in Lapack or anywhere else 
end if 
+0

olur: Eğer 'LDL ayrışma LDL değil yani. ;-) – Stobor

+0

Ayrıca, basit bir karşı örnek: [[1, -1], [1, 1]] testinizi geçirir. – Stobor

+0

Ayrıca: LAPACK LDL 'decomp: http://www.netlib.org/lapack/single/ssptrf.f LAPACK Cholesky LL' decomp: http://www.netlib.org/lapack/single/spotrf.f – Stobor

cevap

0

olmayan sıfır matris ara LAPACK rutinleri 'd' ile ilk 's' yerine çift hassas kullanmak için

logical :: not_diag 
integer :: i, j 

not_diag = .false. 

outer: do i = 2, size(A,1) 
    do j = i, size(A, 2) 
    if (A(i,j) > PRECISION) then 
     not_diag = .true. 
     exit outer 
    end if 
    end 
end outer 

if (not_diag) then 
    ! DO LDL' decomposition 
end if 

değer verir. Yani spotrf Sadece nitpick dpotrf

http://www.netlib.org/lapack/double/

+0

Evet, ancak dsptrf.f yoktur, sadece LDL 'ayrışmasını yapan ssptrf.f. dpotrf, LL'nin ayrışmasını yapar. –

10

yazacağım yuvarlama hataları ve hatalı sonuçlara yol açabilir). İlk olarak, herhangi bir ihlal unsuru bulduktan sonra hemen geçişi durdurabilir ve matrislerin normal olması durumunda bu, önemli bir süre düşüşüne izin verebilir. İkinci olarak, derleyici tarafından daha iyi döngü açılmasının (Fortran derleyicilerin iyi optimizasyon stratejileri için bilinir) ve daha az etkileşimli bağımlılıklar nedeniyle daha hızlı çip yürütme için potansiyel olarak olanaklı kılınması olasıdır.

Buna ek olarak, önerilen algoritmanızın taşmalara ve hata birikmesine eğilimli olduğu ve "traverse-and-test" algoritmasının olmadığı gerçeğini ekleyin.

+0

Çok teşekkür ederim, ben öyle yapacağım. –

+0

+1. Ayrıca, çoklu işlemci dostu! – Stobor

+0

Ve A simetrik olduğundan, sadece matrisin yarısını geçmeye ihtiyacım var ... Tekrar teşekkürler, "gerçek" bir programcı değilim, bu yüzden çoklu işlemci, yönerge bağımlılıkları vb. Hakkında söyleyemiyorum: D Sadece istatistikçi. ;) –

İlgili konular