การอัพเดทในแนวทแยงของเมทริกซ์แน่นอนบวกที่เป็นสมมาตร


19

เป็น n × nสมมาตรบวกแน่นอน (SPD) เมทริกซ์เบาบาง Gเป็นเมทริกซ์ทแยงมุมเบาบาง nมีขนาดใหญ่ ( n > 10,000) และจำนวนที่ไม่ใช่ศูนย์ใน Gโดยปกติคือ 100 ~ 1,000An×nGnnG

ได้รับการแยกตัวประกอบในรูปแบบ cholesky เป็น L D L TALDLT T

วิธีการปรับปรุงและDได้อย่างมีประสิทธิภาพเมื่อกลายเป็น+ G ?LDAA+G


G มีองค์ประกอบเชิงบวกเท่านั้นหรือไม่ ถ้าเป็นเช่นนั้นนี่คือขอบเขตบนเล็กน้อย: ดูการอัปเดตแนวทแยงเป็นผลรวมของการอัปเดตอันดับหนึ่ง มีวิธี O (n ^ 2) อยู่ในการคำนวณการแยกตัวประกอบของ LDL ^ t ของการอัปเดตอันดับหนึ่ง (การค้นหาโดย Google มีตัวอย่าง) จากนั้นการอัพเดทแบบทแยงมุมของคุณจะทำงานใน O (rn ^ 2) โดยที่ r คือจำนวนองค์ประกอบทแยงมุมที่ไม่ใช่ศูนย์ของ G เนื่องจากลักษณะเฉพาะของการอัปเดตเหล่านี้มีทางลัดในการบันทึกการคำนวณบางอย่าง แต่ไม่ชัดเจนว่าเป็นไปได้หรือไม่ ลดลำดับด้านล่าง O (rn ^ 2)

3
ฉันเห็นด้วย - ฉันไม่เชื่อว่าจะมีวิธีใดที่จะทำการอัปเดตตัวประกอบแบบทแยงมุมสำหรับตัวประกอบแบบ Cholesky ได้เร็วกว่าการทำแบบตัวประกอบซ้ำ แต่การอัปเดตอันดับหนึ่งสามารถทำได้ในเวลาและคุณต้องทำอย่างใดอย่างหนึ่ง ไม่ใช่ศูนย์บนเส้นทแยงมุมของG O(m2)G
Brian Borchers

10
สำหรับและn n Z ( G )ในร้อยมันจะยากที่จะชนะ refactoring หากขนาดของAใหญ่ขึ้นและGมีขนาดเล็กมากก็จะสามารถชดเชยได้ ไม่ว่าในกรณีใดการอัพเดตและการประมาณที่เป็นไปได้นั้นจะครอบคลุมในเชิงลึกโดยระบบสมมาตรเชิงเส้นในแนวทแยงและแบบคงที่สามารถแก้ไขได้ในเวลากำลังสองหลังจากการคำนวณล่วงหน้าหรือไม่ . n104nnz(G)AAG
Jed Brown

5
เจ๊ดฉันคิดว่าคุณควรส่งเสริมความคิดเห็นของคุณเพื่อคำตอบที่นี่
Michael Grant

คำตอบ:


3

แพ็คเกจ CHOLMOD SuiteSparse รุ่นล่าสุด (เบต้า 4.4.5) รองรับการแก้ไขแถว / คอลัมน์แบบสมมาตร (อัปเดตอันดับ 2) สำหรับLDLTแยกย่อยโดยใช้ matlab (และ C) API ฉันใช้มันประสบความสำเร็จในหนึ่งในโครงการของฉัน

คุณสามารถใช้มันเพื่อทำการปรับปรุงnnz(G)สำหรับการแยกตัวประกอบ มันขึ้นอยู่กับสิ่งนี้กระดาษ

ดังนั้นความซับซ้อนจะเป็นO(nnz(G)nnz(L)) ) โดยที่nnz(L)สามารถลดลงอย่างมีนัยสำคัญเมื่อใช้การเปลี่ยนรูปแบบลดการเติมสำหรับAหร็อมแหร็มA

สามารถดาวน์โหลดแพ็คเกจได้จากที่นี่

ด้านล่างนี้เป็นหมายเหตุบางส่วนที่เจ้าของแพ็คเกจมอบให้ (ศาสตราจารย์ Tim Davis):

API:

LD = ldlrowmod (LD, k) ลบแถว / คอลัมน์ k โดยการตั้งค่า A (:, k) และ A (k, :) ไปยังแถวที่ kth / col ของข้อมูลประจำตัว

LD = ldlrowmod (LD, k, C) แทนที่ kth row / col ของ A (ซึ่งจะต้องเป็น kth row / col of identity) ด้วยคอลัมน์ sparse C

ซับซ้อน:

การเพิ่มแถว / ลบต้องใช้เวลาอย่างมากที่สุดO(nnz(L))เวลาดังนั้นหากnnz(L)คือO(n)แล้วเวลาที่มากที่สุดO(n) )

เติมลดการเปลี่ยนแปลง:

มันเป็นความคิดที่ดีที่จะทำให้เมทริกซ์ของผู้ใช้แยกตัวประกอบเช่นเดียวกับในLDLT = A แต่เราเปลี่ยนมาเป็นLDLT = PAPTเพื่อให้Lมีค่าน้อยกว่าศูนย์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.