ฟังก์ชั่น LAPACK ที่สอดคล้องกันหลัง Matlab [Q, R, E] = qr (A) คืออะไร?


12

ฉันกำลังพยายามคำนวณการจัดอันดับที่ดีสำหรับเมทริกซ์อย่างถูก ดังนั้นฉันจึงคำนวณการถอดรหัสคอลัมน์โดยใช้การถอดรหัส QRA

[Q,R,E]=qr(A)

ใน Matlab ฉันประเมินระดับAใช้

tol = size(A,n)*eps*norm(A,'fro'); 
r = sum(abs(diag(R))>tol)

มันใช้งานได้ดีและพล็อตในแนวทแยงทั้งหมดของ R มีลักษณะดังนี้: พล็อต (ประเภท (เอบีเอส (diag (R)), 1, 'ลงมา') 'R *')

หากพอร์ตอัลกอริธึมทั้งหมดเป็น C / Fortran ฉันจะแทนที่ [Q, R, E] = qr (A) โดยใช้ DGEQP3 จาก LAPACK ซึ่งคำนวณคอลัมน์ที่มีการแยกย่อย QR แต่ถ้าฉันใช้การประมาณแบบเดียวกันกับอันดับฉันส่วนใหญ่เข้าใจผิด พล็อตเดียวกันสำหรับผลิตจาก DGEQP3 ดูเหมือนว่า R

อินพุตเมทริกซ์เหมือนกันทั้งสองการทดลอง

คำถามของฉันตอนนี้ฟังก์ชั่น LAPACK คือคอลัมน์ใดที่หมุนแกน QR การสลายตัวจาก Matlab พึ่งพา?

ขอบคุณสำหรับความช่วยเหลือใด ๆ Grisu

แก้ไข: DGEQPF ให้ผลลัพธ์ที่ผิดเหมือนกัน

Edit2:

  • อินพุตเมทริกซ์มีความหนาแน่นสูงและสร้างตามE + s ฉันกรัมn ( E , F )AE+sign(E,F)
  • Aสามารถใช้ได้ที่นี่: http://www-e.uni-magdeburg.de/makoehle/A.mtx.gz (รูปแบบ MatrixMarket)
  • ผิด : http://www-e.uni-magdeburg.de/makoehle/R_wrong.mtx.gzR
  • ฉันใช้ LAPACK 3.4.0 กับ OpenBlas / GotoBLAS (64 บิต)
  • Matlab 7, 2007b, 2010b Linux 32 บิต

แก้ไข 3: - จากการใช้ GDB ฉันพบว่า Matlab 2010b เรียก DGEQP3: # 3 0xaa46ce2f ใน dgeqp3_ () จาก /usr/ubuntu10.04/matlabr2010b/bin/glnx86/../../bin/glnx86/..// ./bin/glnx86/mllapack.so เหตุใดฉันจึงได้รับผลลัพธ์ที่ไม่ถูกต้องโดยใช้ LAPACK (3.4.0 รวมถึงการแก้ไขที่กล่าวถึงในหมายเหตุการทำงาน 176)


คุณสามารถกระตุ้นพฤติกรรมเดียวกันด้วยเมทริกซ์ขนาดเล็กที่คุณสามารถแบ่งปันได้ที่นี่หรือไม่?
GertVdE

ไม่มีโครงสร้างพิเศษใด ๆ ฉันต้องการจะบอกว่า MATLAB ใช้ UMFPACK สำหรับพีชคณิตเชิงเส้นแบบกระจัดกระจาย แต่ฉันไม่แน่ใจว่าไลบรารีพีชคณิตเชิงเส้นที่มีความหนาแน่นสูง A
Aron Ahmadia

คือเบาบาง? คุณสามารถตั้งค่า ">> spparms ('spumoni', 1)" และดูว่ามีบางสิ่งที่เรียกว่า "SuiteSparseQR" ได้รับการใช้งานโดย matlab ในกรณีนั้น A
dranxo

Grisu - ฉันชอบดูเมทริกซ์ของคุณ อย่างไรก็ตามลิงค์www-e.uni-magdeburg.de/makoehle/A.mtx.gzจะไม่ทำงานอีกต่อไป (ในเวลาปัจจุบัน) คุณมีลิงค์ปัจจุบันไปยังเมทริกซ์หรือไม่? ขอบคุณ Les Foster

@LeslieFoster - ยินดีต้อนรับสู่ scicomp!
Aron Ahmadia

คำตอบ:


7

มีสองประเด็นที่นี่:

  • คือหนาแน่นหรือเบาบาง?A
  • คุณมีซอฟต์แวร์ซ้อนกันกับไลบรารีภายในของ MATLAB หรือไม่

หนาแน่นหรือหร็อมแหร็ม?

MATLAB ไม่ได้กล่าวถึง LAPACK เป็นประจำอีกต่อไปอย่างชัดเจนว่ามันเรียกเพื่อรับการแยกตัวประกอบ QR หากมีความหนาแน่นสูง ถ้าข้อมูลในเอกสารสำหรับ MATLAB R2008bยังถือสำหรับรุ่นต่อมาแล้ว MATLAB เรียกจาก LAPACK เมื่อคุณเรียก หากกระจัดกระจายแล้ว MATLAB จะเรียกSuiteSparseQRจากกลุ่มของ Tim Davis ซึ่งมาพร้อมกับ UMFPACK ในไลบรารี SuiteSparseAADGEQP3[Q,R,E] = qr(A)A

คุณมีซอฟต์แวร์ซ้อนกันกับไลบรารีภายในของ MATLAB หรือไม่

อาจไม่ใช่ซึ่งอาจเป็นเหตุผลหนึ่งที่ทำให้คุณได้ผลลัพธ์ที่แตกต่าง

ฉันพบปัญหานี้เมื่อหน่วยทดสอบห้องสมุดฉันเขียนที่ใช้ QR factorizations ฉันใช้ MATLAB เพื่อสร้างต้นแบบงานของฉันและได้ผลลัพธ์ที่แตกต่างจากการใช้ LAPACK หรือ NumPy เท่าที่ฉันสามารถบอกได้เพราะ MathWorks ไม่ได้ทำให้ข้อมูลนี้หาง่าย MATLAB ใช้ VERSER ของ LAPACK ไม่เร็วกว่ารุ่น 3.1.1 และไลบรารี MKL BLAS ของ Intel (สำหรับ Windows, Intel Mac และ Linux) รุ่น 9.1 หรือสูงกว่า (ดูที่นี่ ) ฉันไม่พบอะไรเกี่ยวกับรุ่นของ SuiteSparse MATLAB ที่ใช้ โดยการขุดออนไลน์หรือดูไฟล์ไลบรารีสำหรับระบบของคุณคุณอาจรวบรวมข้อมูลเพิ่มเติมได้ คุณสามารถลองเปลี่ยนไลบรารีที่ MATLAB ลิงก์ไปเพื่อเปรียบเทียบกับไลบรารี่เดียวกันในแพ็คเกจซอฟต์แวร์ Eric Chu จัดทำบทความดีๆอย่างน้อยก็แสดงให้เห็นว่าคุณสามารถแทนที่ห้องสมุด BLAS ของ MATLAB ด้วยตัวคุณเองได้ (แน่นอนคุณต้องยอมรับความเสี่ยงด้วยตนเอง) เขาแนะนำว่าคุณสามารถทำสิ่งเดียวกันกับ LAPACK ได้เช่นกัน อาจเป็นไปได้ที่จะแทนที่รุ่นของ SuiteSparse ที่ MATLAB ใช้กับเวอร์ชันของคุณเอง

เวอร์ชัน LAPACK เปลี่ยนแปลงและทำเช่นนั้นในเวอร์ชัน BLAS พวกเขาอาจใช้อัลกอริทึมที่แตกต่างจากรุ่นเป็นรุ่นหรืออนุสัญญาการสั่งซื้อที่แตกต่างกันแม้ว่ากับ orthogonal และเป็นรูปสามเหลี่ยมด้านบนโดยไม่คำนึงถึงรุ่น การเปลี่ยนแปลงเหล่านี้ทำให้การทำซ้ำเป็นสิ่งที่ท้าทาย แม้แต่ความอดทนที่คุณใช้สำหรับการกำหนดตำแหน่งเชิงตัวเลขของคุณก็ยังเป็นการเรียกการตัดสิน คุณดูเหมือนจะใช้ความอดทนมาตรฐานQ RA=QRQR

ฉันลงเอยด้วยการใช้ NumPy เพื่อสร้างต้นแบบผลลัพธ์ของฉันสำหรับการแยกตัวประกอบ QR เนื่องจากใช้ไลบรารี BLAS และ LAPACK ของระบบ NumPy และ SciPy ไม่ใช่การแทนที่แบบแทนที่สำหรับ MATLAB เนื่องจากทั้งสองห้องสมุดรวมกันขาดการทำงานของ MATLAB แต่สำหรับงานพีชคณิตเชิงเส้นนี้ Python + NumPy + SciPy + Matplotlib ควรทำงานได้ดี


การได้สแต็คซอฟต์แวร์เดียวกันกับ Matlab นั้นเป็นไปไม่ได้ที่ฉันคิดว่า ไม่ต้องการใช้สภาพแวดล้อมอื่นสำหรับการสร้างต้นแบบ ปัญหาคือรหัสทำงานใน Matlab อย่างถูกต้อง แต่ไม่ใช่ใน C.
MK หรือที่รู้จักว่า Grisu

@Grisu: ฉันคิดว่ามันยากมากที่จะได้สแต็คซอฟต์แวร์เดียวกันโดยไม่พยายามลิงก์ในไลบรารีของพวกเขา สิ่งที่ฉันสับสนเกี่ยวกับวิธีที่คุณรู้ว่าผลลัพธ์ใน MATLAB นั้นถูกต้องและผลลัพธ์ใน C นั้นผิด นี่เป็นเมทริกซ์ทดสอบชนิดหนึ่งที่มีคุณสมบัติที่รู้จักหรือไม่? ยิ่งกว่านั้น AronAhmadia นั้นถูกต้อง นอกเหนือจากการจำลองสถาปัตยกรรมและสแต็กซอฟต์แวร์คุณไม่สามารถคาดหวังได้ผลลัพธ์เดียวกันด้วยอัลกอริทึมที่ไม่เสถียร โดยทั่วไปแล้วฉันบอกสิ่งเดียวกันในฟอรัม MATLAB เมื่อสองปีก่อน
Geoff Oxberry

ในความคิดของฉัน QR ไม่เสถียร ฉันไม่สามารถตรวจสอบการสลายตัว QR โดยตรงได้ แต่จากอันดับและเมทริกซ์ Q ฉันคำนวณโปรเจ็กเตอร์และฉันสามารถตรวจสอบได้อย่างง่ายดายว่าผลลัพธ์ที่ดีหรือไม่ดีและ Matlab นั้นดี แต่ฉันพยายามเชื่อมโยงกับห้องสมุด Matlab
MK aka Grisu

@Grisu: มีความแตกต่างที่ชัดเจนระหว่างผลลัพธ์ที่ดีและผลลัพธ์ที่ถูกต้อง ฉันเพิ่งใช้การคำนวณอย่างไม่ถูกต้องซึ่งทำให้ผลลัพธ์ของฉันดูยอดเยี่ยม อย่างไรก็ตามการคำนวณผิดและการคำนวณที่ถูกต้องทำให้ผลลัพธ์ของฉันดูน่าประทับใจน้อยลง (แต่โชคดีที่แสดงให้เห็นว่าผลลัพธ์ของฉันถูกต้อง) คุณพยายามคำนวณเครื่องฉายฉากหรือโปรเจคเตอร์เอียงหรือไม่? (ฉันถามเพราะส่วนสำคัญของวิทยานิพนธ์ของฉันอยู่ในโปรเจ็คเตอร์เอียง)
เจฟฟ์ออกซ์เบอรี่

1
@GeoffOxberry: fwiw ใน MATLAB รุ่นของฉันฉันสามารถโทรหาinternal.matlab.language.versionPlugins.blasและinternal.matlab.language.versionPlugins.lapackรับรุ่น BLAS และ LAPACK ได้
Amro

6

ดูเลสลี่ฟอสเตอร์หน้าซอฟแวร์ยศเปิดเผย ดูเพิ่มเติมนี้LAPACK ทำงานล้มเหลวหมายเหตุวิเคราะห์ยศเปิดเผย xGEQP3QR

คุณควรจะสามารถค้นหาว่ากิจวัตร MATLAB ใดที่ใช้โดยการตั้งจุดพักในตัวดีบั๊กและตรวจสอบสแต็ก ล่าสุดฉันดูเป็นที่ยอมรับเมื่อหลายปีก่อน MATLAB ใช้ไลบรารีที่ใช้ร่วมกันซึ่งในกรณีนี้ชื่อสัญลักษณ์ไม่สามารถแยกออกได้ดังนั้นคุณจะเห็นชื่อฟังก์ชันใน call stack (แต่ไม่ใช่อาร์กิวเมนต์เพราะมันไม่ได้เก็บข้อมูลการดีบัก)


หน้าเกี่ยวกับซอฟต์แวร์เปิดเผยอันดับไม่ได้ช่วย ขั้นตอน RRQR อธิบายว่ามีสิ่งแรกที่ฉันใช้ในความคิดของฉัน แต่มันให้ผลลัพธ์ที่เลวร้ายยิ่งกว่าความคิดในคอลัมน์หมุน
MK aka Grisu

2
@Grisu - มันน่าจะช่วยคุณได้ xGEQP3อัลกอริทึมไม่สมบูรณ์ปลอดภัยสำหรับยศเปิดเผย หากคุณต้องการที่จะรับประกันได้ว่าคุณจะได้รับผลที่ถูกต้องคุณควรใช้ SVD หรือปลอดภัย QR เช่นหรือxGEQPX xGEQPYคุณไม่สามารถคาดหวังว่าอัลกอริทึมที่ไม่เสถียรจะส่งกลับผลลัพธ์เดียวกันในสถาปัตยกรรมที่แตกต่างกันหรือในการใช้งานที่แตกต่างกัน (MATLAB อาจใช้ LAPACK รุ่นเก่ากว่า)
Aron Ahmadia

ฉันรู้ว่า GEQP3 ไม่ได้จัดอันดับ แต่มันให้ผลลัพธ์ที่ถูกต้องมากกว่ารูทีนย่อย RRQR การใช้ SVD แพงเกินไปในอัลกอริธึมภายนอกของฉัน ฉันจะพูดคุยกับหนึ่งในผู้แต่ง LAWN-176 และเขาคิดว่าข้อผิดพลาดนี้ไม่ได้ครอบคลุมถึงข้อบกพร่อง ฉันยังลอง DGEQPF / DGEQP3 จาก LAPACK 3.0.0 ด้วยผลลัพธ์เดียวกัน
MK aka Grisu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.