matris diyagonal olup olmadığını nasıl test edilir?

oy
6

Bir varyans matrisi köşegen olup olmadığını test etmek gerekir. Eğer değilse, Cholesky LDL ayrışma yapacağız. Ama en güvenilir olmalı ve test etmek için en hızlı yöntem matrisi köşegen olduğunu hangi merak ediyorum? Ben Fortran kullanıyorum.

Aklıma gelen ilk şey matrisinin tüm elemanlarının toplamını almak ve bu toplamından diyagonal elemanları substract etmektir. Cevap 0 ise, matris diyagonal olduğunu. -Daha iyi bir fikir?

Fortran ben yazacağım

!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
Oluştur 02/06/2009 saat 04:33
kaynak kullanıcı
Diğer dillerde...                            


2 cevaplar

oy
10

Onlar sıfıra yakın ise sadece (eşitsizlik için yuvarlama hataları eğilimli ve hatalı sonuçlara yol açabilir bir kayan nokta sayısını karşılaştırarak) tüm çapraz kapatma elemanları ve testi çapraz çok daha iyi olurdu.

Önce, tüm ihlal elemanı bulduktan sonra hemen katetme durdurabilir ve ihlal matrisler tipiktir bu önemli zaman düşüşe izin verebilir.

İkincisi, potansiyel (Fortran derleyicileri iyi optimizasyon stratejileri için bilinen) derleyici tarafından daha iyi Döngüler sağlar ve daha hızlı yonga üzerindeki yürütülmesi için daha az olması nedeniyle arası talimat bağımlılıkları için olacaktır.

Buna önerdiğiniz algoritma taşmaları ve hata birikimi ve "çapraz-ve-test" eğilimli olduğu gerçeğini ekleyin algoritma değildir.

Cevap 02/06/2009 saat 04:37
kaynak kullanıcı

oy
0

olmayan sıfır değerler için matris ara

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

çift ​​hassas LAPACK rutinleri 'd' ile ilk 's' yerine kullanmak için. Yani spotrf dpotrf olur

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

Cevap 16/06/2009 saat 08:49
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more