แก้ปัญหา


12

ฉันกำลังย้ายรหัสที่มีอยู่จาก MATLAB ไปยัง C ++ และมีระบบเชิงเส้นเพื่อแก้ไข (แทนที่จะเป็นรูปแบบทั่วไปA x = b )xA=bAx=b

เมทริกซ์นั้นหนาแน่นและอยู่ในรูปแบบทั่วไป แต่ไม่ใหญ่กว่า 1,000x1000 ดังนั้นใน MATLAB คำตอบคือฟังก์ชั่นหรือสัญกรณ์ไปข้างหน้าAmrdivide(b,A)x = b/A;

ฉันจะแก้ไขปัญหานี้ในรหัส C ++ ของฉันโดยใช้รูทีน BLAS และ LAPACK ได้อย่างไร

ฉันคุ้นเคยกับกิจวัตรประจำวัน LAPACK DGESVซึ่งจะช่วยแก้x = BสำหรับxAx=bx

ดังนั้นหนึ่งคิดว่าฉันต้องทำกิจวัตรบางอย่างโดยใช้ตัวแปลงสัญญาณเมทริกซ์:

(xA)T=bT

ATxT=bT

xT=(AT)1bT

แล้วแก้รูปแบบสุดท้ายใช้DGESVการดำเนินงานในการขนย้ายT (ดังนั้นค่าใช้จ่ายในการเคลื่อนย้ายAและค่าใช้จ่ายในการแก้ไขระบบ)ATA

มีวิธีการที่มีประสิทธิภาพมากกว่าหรือดีกว่าอย่างอื่นหรือไม่?

ฉันทำงานกับเมทริกซ์และคลาสเวกเตอร์รวมถึงการใช้ BLAS จากไลบรารี BOOST uBLAS รวมถึงการผูกเข้ากับรูทีนไลบรารี LAPACK ฉันใช้การตั้งค่านี้สำเร็จสำหรับการดำเนินการอื่นและฉันหวังว่าจะหาวิธีแก้ไขปัญหาเฉพาะสำหรับห้องสมุดเหล่านี้

นอกจากนี้ฉันควรทราบว่าฉันกำลังดำเนินการประเภทนี้เพียงไม่กี่ครั้งในระหว่างการตั้งค่ารหัสดังนั้นประสิทธิภาพจึงไม่เป็นปัญหาที่สำคัญ

บางที MATLAB นี้เอกสารบนmrdivideจะเป็นประโยชน์สำหรับคนอื่น ๆ

คำตอบ:


10

AdgesvxATx=bTRANS = 'T'

โปรดทราบว่าด้วย BLAS หรือ LAPACK คุณแทบจะไม่ต้องเปลี่ยน (เมทริกซ์องค์ประกอบในหน่วยความจำ) เมทริกซ์: รูทีนย่อยส่วนใหญ่มีTRANSอาร์กิวเมนต์เพื่อรองรับการทำงานบนเมทริกซ์ทรานสดิวเซอร์หรือเมทริกซ์ที่เก็บไว้ (การขนย้ายจะเทียบเท่ากับการเปลี่ยนเค้าโครงหน่วยความจำที่ต่อเนื่องกันของ Fortran เป็น C-contiguos one และ viceversa)


ขอบคุณสำหรับคำตอบและคำอธิบาย! ฉันทำงานกับ LAPACK น้อยมากและตอนนี้ฉันรู้ว่าจะมองหาตัวเลือก TRANS ฉันมีปัญหาในการรับอาร์กิวเมนต์ TRANS เพื่อทำงานผ่านboost::numeric::bindings::lapack::gesvx()แต่นี่ไม่ใช่ส่วนหนึ่งของคำถามของฉันที่นี่ ถ้าฉันประสบความสำเร็จฉันจะกลับมาพร้อมกับบันทึกเกี่ยวกับวิธีการทำ
NoahR

gesvx()gesvxATX=BATXT=BTXBAXBไม่ใช่ เยี่ยมมากสะดวกกว่า หากใครอื่นสะดุดกับความพยายามที่จะใช้การเพิ่มการเชื่อมโยงตัวเลขฉันจะบอกว่าฉันไม่สามารถรับอินเทอร์เฟซการแปลงที่ใช้ในการแก้ปัญหานี้ได้ ในการทำงานผ่านการผูก
NoahR

gesvxboost::numeric::bindingsATtrans()boost::numeric::bindings::lapack::gesvx( FACT, boost::numeric::bindings::trans(Atransposed), af, ipiv, equed, r, c, b, x, rcond, ferr, berr );

0

A

xA=bxQR=bx=bR1QT

นี้จะทำงานใด ๆ ที่เป็นรูปสี่เหลี่ยมผืนผ้าA


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