อะไรคือไลบรารี C ++ เวกเตอร์ / เมทริกซ์คณิตศาสตร์ / พีชคณิตเชิงเส้นที่ใช้กันอย่างแพร่หลายและการแลกเปลี่ยนต้นทุนและผลประโยชน์ [ปิด]


243

ดูเหมือนว่าโครงการจำนวนมากจะต้องทำคณิตศาสตร์เมทริกซ์อย่างช้าๆและตกหลุมพรางของการสร้างเวกเตอร์ชั้นหนึ่งและค่อยๆเพิ่มฟังก์ชั่นการใช้งานจนกว่าพวกเขาจะได้สร้างห้องสมุดพีชคณิตเชิงเส้นที่กำหนดเองแบบครึ่งทางขึ้นอยู่กับมัน

ฉันต้องการหลีกเลี่ยงที่ในขณะที่ไม่ได้สร้างในการพึ่งพาไลบรารีที่เกี่ยวข้องกันบางอย่าง (เช่น OpenCV, OpenSceneGraph)

อะไรคือไลบรารีเมทริกซ์คณิตศาสตร์ / พีชคณิตเชิงเส้นที่ใช้กันโดยทั่วไปมีอะไรบ้างและเหตุใดจึงตัดสินใจใช้มากกว่าหนึ่ง มีผู้ใดบ้างที่จะไม่แนะนำให้ใช้ด้วยเหตุผลบางอย่าง? ฉันใช้สิ่งนี้โดยเฉพาะในบริบททางเรขาคณิต / เวลา * (2,3,4 Dim) * แต่อาจใช้ข้อมูลมิติที่สูงขึ้นในอนาคต

ฉันกำลังมองหาความแตกต่างเกี่ยวกับ: API, ความเร็ว, การใช้หน่วยความจำ, ความกว้าง / ความสมบูรณ์, ความแคบ / ความจำเพาะ, ความสามารถในการขยายและ / หรือวุฒิภาวะ / ความมั่นคง

ปรับปรุง

ฉันลงเอยด้วยการใช้ Eigen3 ซึ่งฉันมีความสุขมาก


2
เมื่อคุณพูดถึง OSG และ OpenCV ฉันเดาว่าคุณแค่ต้องการประเภทกราฟิก 3D เวกเตอร์ / เมทริกซ์เช่น 3x3 และ 4x4 เมทริกซ์ ฉันใช้คำตอบของฉัน แต่คุณอาจต้องการระบุว่าคุณใช้สิ่งนี้อย่างแม่นยำเพียงใดคุณต้องการการแก้ไขเมทริกซ์หรือไม่ คณิตศาสตร์เมทริกซ์มิติที่สูงขึ้น? ฯลฯ
Reed Copsey

ตอนนี้ฉันแค่ทำสิ่งที่มีรูปทรงเรขาคณิต 2D แต่บางครั้งคุณอาจต้องใช้การดำเนินการ 3x3 กับข้อมูล 2D และมันก็ไม่มีความชัดเจนหากข้อมูล 3D การดำเนินการแบบ 4x4 อาจจำเป็น เราต้องการใช้ห้องสมุดทั่วไปทั่วทั้ง บริษัท ฉันไม่มีความรู้สึกที่ดีสำหรับสิ่งที่การแลกเปลี่ยนจะเป็น ทั่วไปมากขึ้นจะดีกว่า แต่คำถามคือราคาอะไร
Catskul

1
หากคุณเพียงแค่ทำการแปลงรูปเรขาคณิตฉันขอแนะนำให้ดูที่ GGT อย่างที่ฉันได้กล่าวไว้ในคำตอบ มันสมบูรณ์แบบมากสำหรับสิ่งนั้น แต่ไม่ได้ทำอะไร แต่จริง ๆ แล้วดังนั้นมันจึงเป็นตัวเลือกที่สะอาดและง่าย BLAS และ LAPACK เป็นโซลูชันเมทริกซ์เชิงซ้อนที่ซับซ้อน (เช่นเมทริกซ์ 50x50 เมทริกซ์กระจัดกระจาย ฯลฯ ) สำหรับวิทยาศาสตร์และคณิตศาสตร์ไม่ใช่การแปลงเชิงเรขาคณิต
Reed Copsey

คำตอบ:


114

มีโปรเจ็กต์ค่อนข้างน้อยที่ตัดสินบนGeneric Graphics Toolkitสำหรับสิ่งนี้ GMTL ในนั้นดี - มันค่อนข้างเล็กใช้งานได้ดีมากและถูกใช้อย่างกว้างขวางพอที่จะเชื่อถือได้มาก OpenSG, VRJuggler และโปรเจ็กต์อื่น ๆ ล้วน แต่เปลี่ยนมาใช้สิ่งนี้แทนการคำนวณด้วยตัวเองของเวอร์เทอร์ / เมทริกซ์คณิตศาสตร์

ฉันพบว่ามันค่อนข้างดี - มันทำทุกอย่างผ่านเทมเพลตดังนั้นจึงยืดหยุ่นและรวดเร็วมาก


แก้ไข:

หลังจากการอภิปรายแสดงความคิดเห็นและการแก้ไขฉันคิดว่าฉันจะทิ้งข้อมูลเพิ่มเติมบางอย่างเกี่ยวกับประโยชน์และข้อเสียของการใช้งานเฉพาะและทำไมคุณอาจเลือกอีกอันหนึ่งตามสถานการณ์ของคุณ

GMTL -

ประโยชน์ที่ได้รับ: Simple API ออกแบบมาสำหรับเอ็นจิ้นกราฟิก มีประเภทดึกดำบรรพ์จำนวนมากที่มุ่งเน้นไปที่การแสดงผล (เช่นเครื่องบิน, AABB, quatenrions ที่มีการแก้ไขหลาย ๆ ค่าเป็นต้น) ที่ไม่ได้อยู่ในแพ็คเกจอื่น ๆ หน่วยความจำต่ำมากค่าใช้จ่ายค่อนข้างรวดเร็วใช้งานง่าย

ข้อเสีย: API เน้นที่การเรนเดอร์และกราฟิกเป็นพิเศษ ไม่รวมเมทริกซ์วัตถุประสงค์ทั่วไป (NxM) การสลายตัวของเมทริกซ์และการแก้ปัญหา ฯลฯ เนื่องจากสิ่งเหล่านี้อยู่นอกขอบเขตของแอปพลิเคชันกราฟิก / เรขาคณิตแบบดั้งเดิม

ไอเก็น -

ประโยชน์ที่ได้รับ: Clean API , ค่อนข้างใช้งานง่าย รวมถึงโมดูลรูปทรงเรขาคณิตพร้อมควอเทอร์เนียนและการแปลงรูปทรงเรขาคณิต ค่าใช้จ่ายหน่วยความจำต่ำ เต็มperformant สูงแก้เมทริกซ์ NxN ขนาดใหญ่และอื่น ๆ ที่ใช้งานทั่วไปการปฏิบัติทางคณิตศาสตร์

ข้อเสีย: อาจเป็นขอบเขตที่กว้างกว่าที่คุณต้องการเล็กน้อย (?) เรขาคณิตน้อยลง / กิจวัตรเฉพาะการเรนเดอร์เมื่อเทียบกับ GMTL (เช่น: นิยามมุมออยเลอร์, ฯลฯ )

IMSL -

ประโยชน์: ห้องสมุดตัวเลขที่สมบูรณ์มาก เร็วมาก (แก้ตัวเร็วที่สุด) API ทางคณิตศาสตร์ที่ใหญ่ที่สุดและสมบูรณ์ที่สุด สนับสนุนเชิงพาณิชย์เป็นผู้ใหญ่และมีเสถียรภาพ

ข้อเสีย: ต้นทุน - ไม่ถูก มีวิธีการทางเรขาคณิต / การเรนเดอร์น้อยมากดังนั้นคุณจะต้องกลิ้งตัวเองไว้บนคลาสพีชคณิตเชิงเส้น

NT2 -

ประโยชน์ที่ได้รับ: แสดงไวยากรณ์ที่คุ้นเคยมากขึ้นหากคุณคุ้นเคยกับ MATLAB ให้การสลายตัวเต็มรูปแบบและการแก้สำหรับเมทริกซ์ขนาดใหญ่ ฯลฯ

ข้อเสีย: คณิตศาสตร์ไม่เน้นการแสดงผล อาจไม่ใช่นักแสดงเช่นเดียวกับ Eigen

LAPACK -

ประโยชน์: อัลกอริธึมที่เสถียรและผ่านการพิสูจน์แล้ว รับรอบเป็นเวลานาน การแก้เมทริกซ์ที่สมบูรณ์ ฯลฯ มีตัวเลือกมากมายสำหรับคณิตศาสตร์ที่ไม่ชัดเจน

ข้อเสีย: ไม่ค่อยมีประสิทธิภาพในบางกรณี พอร์ตจาก Fortran พร้อมด้วย API แปลก ๆ สำหรับการใช้งาน

โดยส่วนตัวแล้วสำหรับฉันมันมีคำถามเดียว - คุณวางแผนจะใช้สิ่งนี้อย่างไร หากคุณโฟกัสอยู่ที่การเรนเดอร์และกราฟิกฉันชอบGeneric Graphics Toolkitเนื่องจากทำงานได้ดีและสนับสนุนการเรนเดอร์ที่มีประโยชน์มากมายนอกกรอบโดยไม่ต้องใช้ตัวคุณเอง หากคุณต้องการการแก้เมทริกซ์สำหรับวัตถุประสงค์ทั่วไป (เช่น: การสลายตัว SVD หรือ LU ของเมทริกซ์ขนาดใหญ่) ฉันจะไปกับEigenเพราะมันจัดการกับมันให้การดำเนินการทางเรขาคณิตบางอย่างและมีประสิทธิภาพมากด้วยโซลูชันเมทริกซ์ขนาดใหญ่ คุณอาจจำเป็นต้องเขียนการดำเนินการด้านกราฟิก / เรขาคณิตของคุณเอง (ด้านบนของเมทริกซ์ / เวกเตอร์) แต่ก็ไม่น่ากลัว


คุณประเมินห้องสมุดอื่นก่อนตัดสินใจใช้ GMTL หรือไม่ การเปรียบเทียบผิวเผินทำให้ฉันเชื่อว่า Eigen ได้รับการสนับสนุนที่ดีกว่า แต่นั่นคือพื้นฐานของการตรวจสอบเว็บไซต์ที่เกี่ยวข้อง คุณรู้หรือไม่ว่าข้อดีข้อใดข้อหนึ่งเหนือสิ่งอื่นใด?
Catskul

Eigen ทำงานได้ดีเช่นกัน มันไม่เป็นผู้ใหญ่ในขณะที่ฉันทำการสอบสวน แต่ฉันเชื่อว่ามันจะเป็นตัวเลือกที่ดี ณ จุดนี้ GMTL มีการใช้กันอย่างแพร่หลายและค่อนข้างสมบูรณ์และมั่นคงเมื่อฉันตัดสินใจใช้
Reed Copsey

ฉันเดาที่จะตัดคำถามของฉันไปที่ crux มาก: คุณเคยเลือกตัวเลือกเช่น "นี่ดูดีกว่า" หรือมีคุณลักษณะเฉพาะ (เช่น api, speed, memory use, breadth, narrowness, extensibility) ที่สร้างความแตกต่าง ฉันคิดว่าวุฒิภาวะนั้นตกอยู่ภายใต้เกณฑ์นี้ แต่ถ้าครบกําหนดเป็นตัวชี้วัดเดียวฉันคิดว่าคุณน่าจะเลือกตัวเลือกที่อิงตาม BLAS หรือ LAPACK
Catskul

ฉันเลือกตัวเลือกนี้หลังจากลองใช้ตัวเลือกหลายตัวและใช้เป็นตัวเลือก: ประสิทธิภาพการใช้งานและค่าใช้จ่ายในการรันไทม์ / คอมไพล์ต่ำ Eigen ดูดีกว่าตอนนี้มากดังนั้นฉันจึงไม่สามารถตัดสินระหว่างพวกเขาได้ อย่างไรก็ตามฉันมีความสุขมากกับ GMTL สำหรับการใช้งานของเรา
Reed Copsey

นั่นเป็นส่วนหนึ่งของเหตุผลที่ฉันชอบ GMTL และใช้งาน มันรู้สึกเป็นธรรมชาติมากที่จะใช้และก็ง่ายมากที่จะทำงานกับ นอกจากนี้ยังรองรับทุกสิ่งที่ฉันต้องการในกรณีนี้เนื่องจากฉันเป็นเพียงความกังวลเกี่ยวกับการจัดการการเปลี่ยนแปลงทางเรขาคณิตโดยตรงและการหมุนของควอเทอเนียน
Reed Copsey

38

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

ฉันจะพูดถึงด้านบนที่ฉันไปกับ GMTL แม้จะเป็นเรื่องแปลกเพราะ Eigen2 unsafeness ไม่ใหญ่เกินไปเสีย แต่เมื่อเร็ว ๆ นี้ฉันได้เรียนรู้ว่ารุ่นถัดไปของ Eigen2 จะมีคำจำกัดความที่จะปิดรหัสการจัดตำแหน่งและทำให้ปลอดภัย ดังนั้นฉันอาจสลับไป

อัปเดต : ฉันเปลี่ยนเป็น Eigen3 แล้ว แม้จะเป็นเรื่องแปลก ๆ แต่ขอบเขตและความสง่างามของมันนั้นยากที่จะเพิกเฉยและการปรับแต่งที่ทำให้ไม่ปลอดภัยสามารถถูกปิดได้ด้วยการกำหนด

Eigen2 / Eigen3

ประโยชน์ที่ได้รับ: LGPL MPL2, Clean, API ที่ออกแบบมาดีใช้งานค่อนข้างง่าย ดูเหมือนว่าจะได้รับการดูแลอย่างดีกับชุมชนที่มีชีวิตชีวา ค่าใช้จ่ายหน่วยความจำต่ำ ประสิทธิภาพสูง. สร้างขึ้นสำหรับพีชคณิตเชิงเส้นทั่วไป แต่มีฟังก์ชันการทำงานทางเรขาคณิตที่ดีเช่นกัน lib ส่วนหัวทั้งหมดไม่จำเป็นต้องเชื่อมโยง

Idiocyncracies / downsides: (บางส่วน / ทั้งหมดเหล่านี้สามารถหลีกเลี่ยงได้โดยการกำหนดบางอย่างที่มีอยู่ในสาขาการพัฒนาปัจจุบัน Eigen3)

  • การเพิ่มประสิทธิภาพประสิทธิภาพที่ไม่ปลอดภัยทำให้ต้องมีการปฏิบัติตามกฎอย่างระมัดระวัง การไม่ปฏิบัติตามกฎจะทำให้ระบบล่ม
    • คุณไม่สามารถส่งผ่านค่าได้อย่างปลอดภัย
    • การใช้ชนิด Eigen เนื่องจากสมาชิกต้องการการปรับแต่งตัวจัดสรรพิเศษ (หรือคุณผิดพลาด)
    • ใช้กับชนิดคอนเทนเนอร์ stl และเทมเพลตอื่น ๆ ที่จำเป็นต้องมีการปรับแต่งการจัดสรรพิเศษ (หรือคุณจะผิดพลาด)
    • คอมไพเลอร์บางตัวต้องใช้ความระมัดระวังเป็นพิเศษเพื่อป้องกันไม่ให้เกิดข้อขัดข้องในการเรียกใช้ฟังก์ชัน (หน้าต่าง GCC)

GMTL

ประโยชน์ที่ได้รับ: LGPL, API ที่ค่อนข้างเรียบง่ายออกแบบมาโดยเฉพาะสำหรับเอ็นจิ้นกราฟิก มีประเภทดึกดำบรรพ์จำนวนมากที่มุ่งเน้นไปที่การแสดงผล (เช่นเครื่องบิน, AABB, quatenrions ที่มีการแก้ไขหลาย ๆ ค่าเป็นต้น) ที่ไม่ได้อยู่ในแพ็คเกจอื่น ๆ หน่วยความจำต่ำมากค่าใช้จ่ายค่อนข้างรวดเร็วใช้งานง่าย ส่วนหัวทั้งหมดขึ้นอยู่กับการเชื่อมโยงไม่จำเป็น

Idiocyncracies / ข้อเสีย:

  • API แปลกประหลาด
    • สิ่งที่อาจเป็น myVec.x () ใน lib อื่นมีให้บริการผ่าน myVec เท่านั้น [0] (ปัญหาการอ่านได้)
      • อาร์เรย์หรือ stl :: vector ของคะแนนอาจทำให้คุณทำสิ่งต่าง ๆ เช่น pointsList [0] [0] เพื่อเข้าถึงส่วนประกอบ x ของจุดแรก
    • ในความพยายามที่ไร้เดียงสาในการเพิ่มประสิทธิภาพลบ cross (vec, vec) และแทนที่ด้วย makeCross (vec, vec, vec) เมื่อคอมไพเลอร์กำจัดอุณหภูมิที่ไม่จำเป็นต่อไป
    • การดำเนินการทางคณิตศาสตร์ปกติจะไม่ส่งคืนชนิดปกติเว้นแต่คุณจะปิดคุณสมบัติการปรับให้เหมาะสมบางอย่างเช่น: vec1 - vec2ไม่ส่งคืนเวกเตอร์ปกติดังนั้นจึงlength( vecA - vecB )ล้มเหลวแม้ว่าจะใช้vecC = vecA - vecBงานได้ คุณต้องห่อเช่น:length( Vec( vecA - vecB ) )
    • การดำเนินการกับเวกเตอร์นั้นได้มาจากฟังก์ชันภายนอกมากกว่าสมาชิก สิ่งนี้อาจทำให้คุณต้องใช้การแก้ปัญหาขอบเขตทุกที่เนื่องจากชื่อสัญลักษณ์ทั่วไปอาจชนกัน
    • คุณต้องทำ
        length( makeCross( vecA, vecB ) )
      หรือ
        gmtl::length( gmtl::makeCross( vecA, vecB ) )
      ที่อื่นคุณอาจลอง
        vecA.cross( vecB ).length()
  • ไม่ได้รับการดูแลอย่างดี
    • ยังคงอ้างว่าเป็น "เบต้า"
    • เอกสารขาดข้อมูลพื้นฐานเช่นส่วนหัวที่จำเป็นในการใช้ฟังก์ชันการทำงานปกติ
      • Vec.h ไม่ได้มีการดำเนินงานสำหรับเวกเตอร์ VecOps.h ประกอบด้วยบางคนอื่น ๆ อยู่ใน Generate.h ตัวอย่างเช่น cross (vec &, vec &, vec &) ใน VecOps.h, [make] cross (vec &, vec &) ใน Generate.h
  • API ที่ยังไม่สมบูรณ์ / ไม่เสถียร ยังคงเปลี่ยนไป
    • ตัวอย่างเช่น "cross" ได้ย้ายจาก "VecOps.h" เป็น "Generate.h" จากนั้นเปลี่ยนชื่อเป็น "makeCross" ตัวอย่างเอกสารล้มเหลวเนื่องจากยังอ้างถึงฟังก์ชันรุ่นเก่าที่ไม่มีอยู่อีกต่อไป

NT2

ไม่สามารถบอกได้เพราะดูเหมือนว่าพวกเขาจะสนใจส่วนหัวของภาพเศษส่วนของหน้าเว็บมากกว่าเนื้อหา ดูเหมือนโครงการทางวิชาการมากกว่าโครงการซอฟต์แวร์ที่ร้ายแรง

รุ่นล่าสุดกว่า 2 ปีที่ผ่านมา

เห็นได้ชัดว่าไม่มีเอกสารภาษาอังกฤษแม้ว่าจะมีบางอย่างในภาษาฝรั่งเศส

ไม่พบร่องรอยของชุมชนรอบ ๆ โครงการ

LAPACK & BLAS

ประโยชน์: เก่าและแก่แล้ว

ข้อเสีย:

  • เก่าเหมือนไดโนเสาร์ที่มี API เส็งเคร็งจริงๆ

1
เกี่ยวกับการยืนยันการจัดตำแหน่ง Eigen: เพื่อให้ได้ประสิทธิภาพสูงจากการดำเนินงาน SSE (1,2,3 หรือ 4) สำหรับชุดข้อมูลขนาดเล็กคุณจำเป็นต้องมีข้อมูลที่สอดคล้องกันอย่างสมบูรณ์ การดำเนินการโหลด / จัดเก็บที่ไม่ได้จัดแนวจะช้ากว่ามาก การตัดสินใจระหว่างโหลด / ร้านค้าที่ถูกจัดแนวหรือไม่ได้กำหนดก็ต้องใช้เวลาเช่นกัน การใช้งาน "วัตถุประสงค์ทั่วไป" ใด ๆ จะมีช่วงเวลาที่ยากลำบากมากในการทำสิ่งที่ถูกต้องสำหรับทุกคนยกเว้นว่าพวกเขาแยกอินเทอร์เฟซเป็น "การจัดตำแหน่ง" และการดำเนินการ "ไม่ได้จัดแนว" เช่นกัน
Joris Timmermans

@Catskul ฉันต้องการใช้ Eigen3 คุณช่วยขยาย "การเพิ่มประสิทธิภาพที่ทำให้ไม่ปลอดภัยสามารถปิดได้ด้วยการกำหนด" ปัญหาอื่น ๆ ที่คุณแสดงรายการภายใต้ Eigen2 มีรายละเอียดอย่างรอบคอบในเอกสารภายใต้หัวข้อที่เกี่ยวข้องกับปัญหาการจัดตำแหน่ง ฉันสามารถอยู่กับปัญหาเหล่านี้ได้
Ali

ปัญหาเกี่ยวกับความปลอดภัยฉันหมายถึงการจัดตำแหน่งที่เกี่ยวข้องทั้งหมดและจะเหมือนกันจาก Eigen2 ถ้าคุณโอเคกับ Eigen2 คุณก็ใช้ได้กับ Eigen3
Catskul

2
BLAS และ LAPACK ไม่ใช่ไลบรารี แต่เป็นข้อมูลจำเพาะ / API คุณสามารถพูดถึงการใช้งานครั้งแรกโดย netlib หรือการใช้งานอื่น ๆ เช่น ATLAS และ OpenBLAS
โหลด

12

สำหรับสิ่งที่คุ้มค่าฉันได้ลองทั้ง Eigen และ Armadillo ด้านล่างเป็นการประเมินผลแบบย่อ

ข้อดีของ Eigen: 1. สมบูรณ์ในตัวเอง - ไม่ต้องพึ่งพา BLAS หรือ LAPACK ภายนอก 2. เอกสารที่เหมาะสม 3. เร็วเร็วถึงแม้ว่าฉันจะไม่ได้ทำการทดสอบก็ตาม

ข้อเสีย: อัลกอริทึม QR ส่งกลับเพียงเมทริกซ์เดียวโดยมีเมทริกซ์ R ฝังอยู่ในสามเหลี่ยมด้านบน ไม่มีความคิดว่าส่วนที่เหลือของเมทริกซ์มาจากไหนและไม่สามารถเข้าถึงเมทริกซ์ Q ได้

อาร์มาดิลโล่ข้อดี: 1. การสลายตัวที่หลากหลายและฟังก์ชั่นอื่น ๆ (รวมถึง QR) 2. เร็วพอสมควร (ใช้เทมเพลตนิพจน์) แต่อีกครั้งฉันไม่ได้ผลักไปยังขนาดสูง

ข้อเสีย: 1. ขึ้นอยู่กับ BLAS ภายนอกและ / หรือ LAPACK สำหรับการย่อยสลายเมทริกซ์ 2. เอกสารกำลังขาด IMHO (รวมถึงเฉพาะ wrt LAPACK นอกเหนือจากการเปลี่ยนคำสั่ง #dine)

คงจะดีถ้าไลบรารี่โอเพ่นซอร์สนั้นพร้อมใช้งานในตัวและตรงไปตรงมาให้ใช้งาน ฉันพบปัญหาเดียวกันนี้มา 10 ปีแล้วและมันก็น่าหงุดหงิด ถึงจุดหนึ่งฉันใช้ GSL สำหรับ C และเขียนตัวห่อ C ++ รอบ ๆ แต่ด้วย C ++ ที่ทันสมัย ​​- โดยเฉพาะการใช้ข้อดีของเทมเพลตนิพจน์ - เราไม่ควรยุ่งกับ C ในศตวรรษที่ 21 เพียง tuppencehapenny ของฉัน


2
อาร์มาดิลโล่มีไวยากรณ์เหมือน Matlab โดยเจตนาเพื่อให้ง่ายต่อการใช้งาน ฉันไม่แน่ใจว่าสิ่งที่คุณหมายถึงเกี่ยวกับ "เอกสารขาด ... เฉพาะ wrt LAPACK" เอกสารอธิบายอย่างชัดเจนถึงฟังก์ชั่นทั้งหมดที่ผู้ใช้มีรวมถึงตัวอย่างวิธีใช้ จุดทั้งหมดเกี่ยวกับไลบรารีของ C ++ wrapper คือการสรุปความซับซ้อนและ verbosity ของ LAPACK คุณสามารถเรียกดูแหล่งข้อมูลได้ตลอดเวลาหากคุณต้องการดูว่าอาร์มาดิลโลเรียก LAPACK อย่างไร
mtall

เกี่ยวกับการย่อยสลาย QR ใน Eigen คุณหมายถึง Eigen2 หรือ Eigen3 หรือไม่
qed

11

หากคุณกำลังมองหาเมทริกซ์ / พีชคณิตเชิงเส้นที่มีประสิทธิภาพสูง / การปรับให้เหมาะสมกับโปรเซสเซอร์ Intel ฉันจะดูห้องสมุด MKL ของ Intel

MKL ได้รับการปรับปรุงให้ดีที่สุดเพื่อประสิทธิภาพการรันไทม์ที่รวดเร็วซึ่งส่วนใหญ่เป็นไปตามมาตรฐาน Fortran ของ BLAS / LAPACK และประสิทธิภาพการทำงานของเครื่องชั่งที่มีจำนวนแกนที่มีอยู่ ความสามารถในการขยายระบบแฮนด์ฟรีพร้อมคอร์ที่มีอยู่คืออนาคตของการคำนวณและฉันจะไม่ใช้ไลบรารีคณิตศาสตร์ใด ๆ สำหรับโครงการใหม่ไม่สนับสนุนโปรเซสเซอร์แบบมัลติคอร์

สั้นมากมันรวมถึง:

  1. การดำเนินการพื้นฐานเวกเตอร์เวกเตอร์เวกเตอร์เมทริกซ์และเมทริกซ์เมทริกซ์
  2. การแยกตัวประกอบแบบเมทริกซ์ (LU decomp, Hermitian, sparse)
  3. ปัญหากำลังสองน้อยที่สุดและค่าลักษณะเฉพาะ
  4. ระบบเชิงเส้นกระจัดกระจาย
  5. ตัวแก้กำลังสองน้อยที่สุดที่ไม่ใช่เส้นตรง (ภูมิภาคที่ไว้วางใจ)
  6. บวกรูทีนการประมวลผลสัญญาณเช่น FFT และ convolution
  7. เครื่องกำเนิดตัวเลขสุ่มแบบเร็วมาก
  8. อีกมากมาย .... ดู: ข้อความลิงก์

ข้อเสียคือ MKL API นั้นค่อนข้างซับซ้อนขึ้นอยู่กับกิจวัตรที่คุณต้องการ คุณสามารถดูห้องสมุด IPP (Integrated Performance Primitives) ของพวกเขาซึ่งมุ่งเน้นไปที่การดำเนินการประมวลผลภาพประสิทธิภาพสูง แต่ก็ยังค่อนข้างกว้าง

พอล

ซอฟต์แวร์ CenterSpace,. NET Math ไลบรารี


8

ฉันเคยได้ยินเรื่องดีๆเกี่ยวกับEigenและNT2แต่ก็ไม่ได้ใช้เป็นการส่วนตัว นอกจากนี้ยังมีBoost.UBLASซึ่งฉันเชื่อว่าใช้เวลาค่อนข้างนาน นักพัฒนาของ NT2 กำลังสร้างรุ่นต่อไปโดยมีความตั้งใจที่จะนำมันไปใช้เป็น Boost ดังนั้นอาจนับได้ว่าเป็นเรื่อง

หลินของฉัน ALG ความต้องการไม่ได้ขยายเกินกว่ากรณีเมทริกซ์ 4x4 ดังนั้นฉันจึงไม่สามารถแสดงความคิดเห็นเกี่ยวกับฟังก์ชันการทำงานขั้นสูงได้ ฉันแค่ชี้ให้เห็นตัวเลือกบางอย่าง


จากประสบการณ์ของฉัน (เมทริกซ์ที่ใหญ่กว่า) Boost.UBLAS นั้นถูกใช้มากขึ้น อย่างไรก็ตามเมื่อฉันดูมันฉันไม่ชอบมัน (ส่วนใหญ่เป็นเพราะเอกสารประกอบ) ดังนั้นฉันจึงมุ่งเน้นไปที่ Eigen Eigen มีโมดูลรูปทรงเรขาคณิตแต่ฉันไม่ได้ใช้ด้วยตัวเอง
Jitse Niesen

เห็นได้ชัดว่ามีการใช้ Eigen โดย ROS (อู่ Willow), Celestia, Koffice และ libmv ฉันเห็นเรื่องไร้สาระเกี่ยวกับ UBLAS แต่มีช่วงเวลาที่ยากลำบากในการทำโปรเจ็กต์ที่โฆษณาโดยใช้มัน เหมือนกันสำหรับ NT2 คุณช่วยอธิบายสิ่งที่ดีที่คุณได้ยินได้ไหม
Catskul

มันอยู่ในการสนทนาในรายชื่อส่งเมล์ Boost เกี่ยวกับการเพิ่มไลบรา LinAlg สมัยใหม่ให้กับ Boost - Eigen และ NT2 ถูกกล่าวถึงว่าเป็นผู้สมัครที่เป็นไปได้ แต่มีเพียงนักพัฒนา NT2 เท่านั้นที่แสดงความสนใจในการติดตาม ห้องสมุดทั้งสองดูดี อย่างที่คุณพูด Eigen นั้นได้รับความนิยมเพิ่มขึ้นเล็กน้อยและ C ++ ก็มีมากขึ้นเช่นกัน NT2 ออกแบบมาเพื่อเลียนแบบ MATLAB ให้มากที่สุด
เจฟฟ์ฮาร์ดี

8

ฉันยังใหม่กับหัวข้อนี้ดังนั้นฉันจึงไม่สามารถพูดอะไรได้มากมาย แต่BLASนั้นเป็นมาตรฐานในการคำนวณทางวิทยาศาสตร์ BLAS เป็นมาตรฐาน API จริง ๆ ซึ่งมีการนำไปใช้งานหลายอย่าง ฉันไม่แน่ใจว่าการใช้งานแบบใดที่ได้รับความนิยมมากที่สุดหรือเพราะอะไร

หากคุณต้องการนอกจากนี้ยังสามารถที่จะทำดำเนินการพีชคณิตเชิงเส้นที่พบบ่อย (แก้ระบบสี่เหลี่ยมน้อยถดถอยสลายตัว ฯลฯ ) ลักษณะเป็นLAPACK


7

แล้วGLMล่ะ?

เป็นไปตามข้อกำหนด OpenGL Shading Language (GLSL) และเผยแพร่ภายใต้ลิขสิทธิ์ MIT มุ่งเน้นไปที่โปรแกรมเมอร์กราฟิกอย่างชัดเจน


มันให้เวคเตอร์การเขียนโปรแกรมกราฟิกและเมทริกซ์ มันแนะนำค่าใช้จ่ายที่ดีเพื่อให้เป็นไปตามมาตรฐาน GLSL (ถ้าคุณสามารถทำได้ใน GLSL เวลาส่วนใหญ่ที่ทำใน GLSL นั้นดีกว่าโดยเฉพาะอย่างยิ่งกับ GL 4.x) และพลาดการเขียนโปรแกรมกราฟิกแบบดั้งเดิมมากมาย (frustum, AABB, BB, ellipsoid ) อินเทอร์เฟซ Swizzle มันเป็นโรคอ้วน ทางเลือกที่ดีกว่านั้นคือหากมีฟังก์ชัน ".xyzz ()" ที่สร้างด้วยการสร้างรหัสบางอย่าง มันสมบูรณ์แบบเมื่อคุณต้องต้นแบบแอปพลิเคชัน OpenGL และเริ่มแสดงด้านลบในโครงการขนาดใหญ่ ไม่เคยรหัสห้องสมุดคณิตศาสตร์
CoffeDeveloper

5

ฉันจะเพิ่มการลงคะแนนสำหรับ Eigen: ฉันได้รับโค้ดจำนวนมาก (เรขาคณิต 3 มิติพีชคณิตเชิงเส้นและสมการเชิงอนุพันธ์) จากไลบรารีที่แตกต่างกันไปยังไลบรารีนี้ - ปรับปรุงประสิทธิภาพและการอ่านโค้ดในเกือบทุกกรณี

ข้อดีอย่างหนึ่งที่ไม่ได้กล่าวถึง: ใช้งานง่ายมากกับ SSE กับ Eigen ซึ่งปรับปรุงประสิทธิภาพการทำงานแบบ 2D-3D อย่างมีนัยสำคัญ (ซึ่งทุกอย่างสามารถเพิ่มได้ถึง 128 บิต)


1
"ถ้าคุณทำสิ่งนี้ทั้งหมดให้แน่ใจว่า ... " สิ่งที่ทำให้ฉันเป็นบิตของธงสีแดง จนถึงตอนนี้ฉันพบปัญหาเหล่านี้สองครั้งและฉันเพิ่งเริ่มใช้งาน ฉันหวังว่าจะไม่สร้างภาระให้กับนักพัฒนาในอนาคตเพราะรู้ว่าไอเดียทุกประเภทของห้องสมุดแต่ละอันรวมอยู่: โดยเฉพาะปัญหาการจัดตำแหน่งที่มันพังถ้าคุณไม่ใช้มาโครบางตัวในแต่ละครั้งที่คุณมีสมาชิกและความจริงที่ว่า เรียนในหลายส่วนหัว เพียงอย่างเดียวอาจไม่ทำให้ฉันเลือกได้ แต่มันส่งสัญญาณธงสีแดงเล็กน้อย
Catskul

1
การจัดตำแหน่งและแมโครนั้นสำคัญเฉพาะเมื่อคุณใช้ SSE ซึ่งไม่จำเป็นต้องใช้ และถ้าคุณใช้ SIMD ปัญหาเหล่านั้นจะเพิ่มขึ้นทุกไลบรารีที่คุณใช้ อย่างน้อย Eigen ไม่เพียง แต่พัง แต่ให้ข้อความแสดงข้อผิดพลาดที่มีความหมายซึ่งชี้ไปที่ปัญหาโดยตรง
ima

และมีวิธีที่ง่ายในการหลีกเลี่ยงมาโครการจัดตำแหน่ง - ใช้ตัวชี้หรือการอ้างอิงเป็นสมาชิก
ima

1
ฉันไม่คิดว่ามันเป็นเรื่องจริง ฉันไม่ใช้ตัวเลือก SSE พิเศษและได้รับข้อขัดข้องหลายอย่างหลังจากใช้กับคอนเทนเนอร์ stl ใช่ฉันรู้ว่ามันให้ข้อความที่เป็นประโยชน์แก่คุณและใช่ฉันรู้ว่ามีคำแนะนำพิเศษ แต่นั่นคือประเด็นของฉัน ฉันไม่ต้องการเป็นภาระให้นักพัฒนารายอื่นด้วยคำแนะนำพิเศษสำหรับห้องสมุดแต่ละแห่ง ยกตัวอย่างเช่นการไม่ผ่านสิ่งมีค่าเป็นเพียงมากเกินไป
Catskul

ฉันเพิ่งพบว่าสาขาการพัฒนาล่าสุดมีบางอย่างที่คุณสามารถใช้เพื่อปิดการจัดตำแหน่งและหลีกเลี่ยงปัญหาที่เกี่ยวข้อง
Catskul

4

โอเคฉันคิดว่าฉันรู้ว่าคุณกำลังมองหาอะไร ดูเหมือนว่า GGT เป็นทางออกที่ดีงามตามที่ Reed Copsey แนะนำ

โดยส่วนตัวแล้วเราเปิดห้องสมุดเล็ก ๆ ของเราเองเพราะเราจัดการกับคะแนนที่มีเหตุผลมาก - NURBS และ Beziers ที่มีเหตุผลจำนวนมาก

ปรากฎว่าห้องสมุดกราฟิก 3 มิติส่วนใหญ่ทำการคำนวณด้วยจุดฉายที่ไม่มีพื้นฐานในคณิตศาสตร์ฉายภาพเพราะนั่นคือสิ่งที่ทำให้คุณได้รับคำตอบที่คุณต้องการ เราลงเอยด้วยการใช้คะแนน Grassmann ซึ่งมีพื้นฐานทางทฤษฎีที่มั่นคงและลดจำนวนประเภทของจุด คะแนน Grassmann นั้นเป็นพื้นฐานการคำนวณแบบเดียวกับที่ผู้คนใช้อยู่ในขณะนี้ด้วยประโยชน์ของทฤษฎีที่แข็งแกร่ง สิ่งสำคัญที่สุดคือทำให้สิ่งต่าง ๆ ชัดเจนในใจของเราดังนั้นเราจึงมีข้อบกพร่องน้อยลง รอนโกลด์แมนเขียนบทความเกี่ยวกับคะแนน Grassmann ในกราฟิกคอมพิวเตอร์ที่เรียกว่า "ในพีชคณิตเรขาคณิตและฐานรากของคอมพิวเตอร์กราฟฟิค"

ไม่เกี่ยวข้องโดยตรงกับคำถามของคุณ แต่เป็นการอ่านที่น่าสนใจ


มันเป็นการเปิดโดยเจตนาโดยที่ฉันไม่รู้ว่าการแลกเปลี่ยนนั้นคืออะไร มันอาจยุติธรรมที่จะบอกว่าเรขาคณิตเป็นปัญหาหลักของเรามิติของเรขาคณิตไม่ชัดเจน ขณะนี้เป็น 2/3 (2 + เวลา) และอาจจะค่อนข้างสูง (3 มิติ + เวลา + หลายมิติสลัว)
Catskul

ฉันเห็นด้วยกับคำถาม ตัวอย่างเช่นแอปพลิเคชันจำนวนมากในประเภทนี้ต้องการประสิทธิภาพแบบเรียลไทม์ (พฤติกรรมตามเวลาที่สอดคล้องกัน) ในขณะที่แอปอื่น ๆ จำนวนมากยอมสละความสม่ำเสมอและ / หรือความเร็วเพื่อความแม่นยำ
TED

คุณกำลังบอกว่าห้องสมุดที่คุณตรวจสอบไม่มีใครดูแล NURBS และ Beziers หรือไม่? มีเหตุผลใดที่ไม่ได้รับหนึ่งในห้องสมุดที่มีอยู่และสร้าง NURBS และ Bezier ให้การสนับสนุนควบคู่ไปกับมัน?
Catskul

สิ่งที่ฉันพยายามจะพูดคือ NURBS เหตุผลและ Beziers ใช้จุดควบคุมเหตุผลมากกว่าแอพพลิเคชั่น 3 มิติส่วนใหญ่ดังนั้นเราจึงทำผิดพลาดมากขึ้น โดยทั่วไปแล้วแอป 3 มิติส่วนใหญ่จะมีจุดและเวกเตอร์วานิลลา 3 มิติจนกระทั่งหลังจากผ่านการเปลี่ยนมุมมอง อัลกอริทึมของเราจำนวนมากต้องสามารถจัดการกับน้ำหนัก / เหตุผล / โปรเจคทีฟและคะแนนคาร์ทีเซียนอย่างถูกต้องไปและกลับ ฯลฯ
tfinniga


0

ฉันพบห้องสมุดนี้ค่อนข้างง่ายและใช้งานได้ ( http://kirillsprograms.com/top_Vectors.php ) นี่คือพาหะกระดูกเปลือยที่นำไปใช้ผ่านแม่แบบ C ++ ไม่มีสิ่งแฟนซี - สิ่งที่คุณต้องทำกับเวกเตอร์ (บวกลบทวีคูณจุด ฯลฯ )


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