Simetrik pozitif belirli bir matrisin çapraz güncellenmesi


19

A a, simetrik pozitif tanımlı (SPD) seyrek bir matris. , seyrek bir diyagonal matristir. bir büyük ( > 10000) ve nonzeros sayısı genellikle -1000 100'dür.n×nGnnG

A , kolesky formunda olarak çarpanlarına ayrılmıştır .LDLT

Nasıl güncellemek için ve verimli zaman olur ?D A A + GLDAA+G


G'nin sadece olumlu unsurları var mı? Öyleyse, burada önemsiz bir üst sınır: çapraz güncellemeyi, birinci sırada güncellemelerin toplamı olarak görüntüleyin. Sıralı bir güncellemenin LDL ^ t çarpanlarına ayırma işlemini hesaplamak için O (n ^ 2) yöntemleri vardır (google arama örnekler sağlar). Sonra çapraz güncellemeniz O (rn ^ 2) 'de çalışacaktır, burada r, G'nin sıfır olmayan köşegen öğelerinin sayısıdır. Bu güncellemelerin özel doğası göz önüne alındığında, bazı hesaplamaları kaydetmek için kısayollar vardır, ancak Sırayı O (rn ^ 2) altına düşürün.

3
Katılıyorum- Cholesky çarpanlarına ayırma işleminde çarpanlara ayırmayı sadece çarpanlara ayırma işleminden daha hızlı yapmanın bir yolu olmadığına inanmıyorum, ancak bir güncellemenin zamanında yapılabileceği ve her biri için bir tanesinin yapılabilmesi gerektiğine inanıyorum G diyagonal üzerinde sıfır . O(m2)G,
Brian Borchers

10
İçin ve n, n, Z ( G ) yüzlerce, üstlenmeden yenmek için zor olacak A . A boyutu çok büyür ve G çok seyrek olursa, ödeyebilir. Her halükarda, olası güncellemeler ve tahminler, diyagonal artı sabit simetrik doğrusal sistemler, ön hesaplamadan sonra ikinci dereceden sonra çözülebilir mi? . n~104nnz(G)AAG
Jed Brown

5
Jed, bence buradaki cevaba yorumunuzu tanıtmalısınız.
Michael Grant

Yanıtlar:


3

CHOLMOD SuiteSparse paketinin (beta 4.4.5) en son sürümü, bir matlab (ve C) API kullanarak LDLT ayrışması için simetrik bir satır / sütun (sıra 2 güncellemesi) değiştirmeyi destekler . Projelerimden birinde başarıyla kullandım.

Sen yapmak için kullanabilirsiniz nnz(G) çarpanlara güncellemeleri. Bu makaleye dayanmaktadır .

Bu nedenle, karmaşıklık O(nnz(G)nnz(L)) . Burada nnz(L) , bir kullanıldığında önemli ölçüde azaltılabilir permütasyon indirgeme dolgu seyrek için A

Paket indirilebilir burada

Paket sahibinin verdiği bazı notlar aşağıdadır (Prof. Tim Davis):

API:

LD = ldlrowmod (LD, k), A (:, k) ve A (k, :) öğelerini k. Satır / kimlik sütununa ayarlayarak satır / sütun k'yi siler.

LD = ldlrowmod (LD, k, C), A'nın kth sırasını / sütununu (kth satırı / kimlik sütunu olması gerekir) seyrek sütun C ile değiştirir.

karmaşıklık:

Satır ekle / silme en alır O(nnz(L)) bu durumda, zaman nnz(L) olan O(n) , o zaman süresi, en fazla bir O(n) .

Doldurmayı azaltan permütasyon:

LDLT = A'da olduğu gibi, bir kullanıcının matrisini çarpanlarına ayırmak iyi bir fikirdir . Bunun yerine, LDLT = PAPT izin veririz, böylece L çok daha az sıfırdan farklıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.