ตัวดำเนินการแบ็กสแลช MATLAB จะแก้ปัญหา


36

ฉันกำลังเปรียบเทียบรหัสของฉันบางส่วนกับรหัส "หุ้น" MATLAB ฉันประหลาดใจที่ผลลัพธ์

ฉันรันโค้ดตัวอย่าง (Sparse Matrix)

n = 5000;
a = diag(rand(n,1));
b = rand(n,1);
disp('For a\b');
tic;a\b;toc;
disp('For LU');
tic;LULU;toc;
disp('For Conj Grad');
tic;conjgrad(a,b,1e-8);toc;
disp('Inv(A)*B');
tic;inv(a)*b;toc;

ผล :

    For a\b
    Elapsed time is 0.052838 seconds.

    For LU
    Elapsed time is 7.441331 seconds.

    For Conj Grad
    Elapsed time is 3.819182 seconds.

    Inv(A)*B
    Elapsed time is 38.511110 seconds.

สำหรับเมทริกซ์หนาแน่น:

n = 2000;
a = rand(n,n);
b = rand(n,1);
disp('For a\b');
tic;a\b;toc;
disp('For LU');
tic;LULU;toc;
disp('For Conj Grad');
tic;conjgrad(a,b,1e-8);toc;
disp('For INV(A)*B');
tic;inv(a)*b;toc;

ผล:

For a\b
Elapsed time is 0.575926 seconds.

For LU
Elapsed time is 0.654287 seconds.

For Conj Grad
Elapsed time is 9.875896 seconds.

Inv(A)*B
Elapsed time is 1.648074 seconds.

heck นั้นยอดเยี่ยมแค่ไหน?


1
เครื่องหมายแบ็กสแลชในตัวของ MATLAB กล่าวอีกนัยหนึ่งคือตัวแก้ปัญหาโดยตรงสำหรับระบบสมการเชิงเส้นใช้วิธีการหลายหน้าสำหรับเมทริกซ์แบบกระจัดกระจายนั่นคือสาเหตุที่ A \ B นั้นยอดเยี่ยมมาก
Shuhao Cao

1
มันใช้รหัสทิมเดวิสที่มีอยู่ในcise.ufl.edu/research/sparse ความสุดยอดจะหายไปเมื่อคุณมีปัญหาที่ไม่น่ารำคาญ
ตาลิ

1
"LULU" คืออะไร ทำไมคุณถึงคิดว่ามันเป็นการใช้งานที่ดีของการแยกตัวประกอบ LU และการแก้ปัญหาโดยตรงในภายหลัง
Jed Brown

3
@ ไม่เป็นพิษการดำเนินการอะไร ? คุณเขียนเองหรือ พีชคณิตเชิงเส้นความหนาแน่นสูงที่มีประสิทธิภาพสูงในขณะที่โดยทั่วไปจะเข้าใจดีว่าอัลกอริทึมไม่ใช่เรื่องง่ายที่จะนำไปใช้อย่างมีประสิทธิภาพบนฮาร์ดแวร์ที่ทันสมัย การใช้งาน BLAS / Lapack ที่ดีที่สุดควรเข้าใกล้จุดสูงสุดสำหรับเมทริกซ์ที่มีขนาดนั้น นอกจากนี้จากความคิดเห็นของคุณฉันได้รับความประทับใจที่คุณคิดว่า LU และ Gaussian Elimination เป็นอัลกอริทึมที่แตกต่างกัน
Jed Brown

1
เรียกรหัส Fortran ที่เขียนโดยใช้ Intel MKL
สอบถาม

คำตอบ:


37

ใน Matlab คำสั่ง '\' เรียกใช้อัลกอริทึมซึ่งขึ้นอยู่กับโครงสร้างของเมทริกซ์ A และรวมถึงการตรวจสอบ (ค่าใช้จ่ายเล็ก ๆ ) กับคุณสมบัติของ A.

  1. ถ้า A กระจัดกระจายและมีแถบสีให้ใช้ตัวแก้แถบสี
  2. ถ้า A เป็นเมทริกซ์รูปสามเหลี่ยมด้านบนหรือด้านล่างให้ใช้อัลกอริทึมการทดแทนแบบย้อนกลับ
  3. ถ้า A นั้นเป็นสมมาตรและมีองค์ประกอบที่เป็นเส้นทแยงมุมบวกจริง ๆ ให้ลองใช้ตัวประกอบแบบ Cholesky หาก A กระจัดกระจายให้ใช้การจัดเรียงใหม่ก่อนเพื่อลดการเติม
  4. หากไม่ตรงตามเกณฑ์ข้างต้นให้ทำการแยกตัวประกอบแบบสามเหลี่ยมทั่วไปโดยใช้การกำจัดแบบเกาส์ด้วยการหมุนบางส่วน
  5. ถ้า A กระจัดกระจายให้ใช้ไลบรารี UMFPACK
  6. ถ้า A ไม่ใช่ตารางให้ใช้อัลกอริทึมที่ยึดตามตัวประกอบการ QR สำหรับระบบที่ไม่ได้ระบุ

เพื่อลดค่าใช้จ่ายคุณสามารถใช้คำสั่ง linsolve ใน Matlab และเลือกตัวแก้ไขที่เหมาะสมในตัวเลือกเหล่านี้ด้วยตัวคุณเอง


สมมติว่าฉันกำลังจัดการกับเมทริกซ์หนาแน่นที่ไม่มีโครงสร้าง 10,000x10000 กับองค์ประกอบทั้งหมดที่ไม่ใช่ศูนย์ (ระดับความหนาแน่นสูง) สิ่งที่จะเป็นทางออกที่ดีที่สุดของฉัน ฉันต้องการแยก 1 อัลกอริทึมที่ใช้สำหรับเมทริกซ์หนาแน่น มันคือ LU, QR หรือ Gaussian Elimination หรือไม่?
สอบถาม

1
เสียงเหมือนขั้นตอนที่ 4 ที่มีการเรียกใช้การกำจัดแบบเกาส์ซึ่งสอดคล้องกับกรณีทั่วไปส่วนใหญ่ที่ไม่มีโครงสร้างของ A สามารถใช้เพื่อเพิ่มประสิทธิภาพ ดังนั้นโดยทั่วไปนี่คือการแยกตัวประกอบ LU และต่อไปข้างหน้าตามด้วยขั้นตอนการทดแทนย้อนหลัง
Allan P. Engsig-Karup

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

37

หากคุณต้องการดูว่าอะไรที่a\bทำให้เมทริกซ์เฉพาะของคุณคุณสามารถตั้งค่าspparms('spumoni',1)และคิดได้ว่าอัลกอริทึมใดที่คุณประทับใจ ตัวอย่างเช่น:

spparms('spumoni',1);
A = delsq(numgrid('B',256));
b = rand(size(A,2),1);
mldivide(A,b);  % another way to write A\b

จะส่งออก

sp\: bandwidth = 254+1+254.
sp\: is A diagonal? no.
sp\: is band density (0.01) > bandden (0.50) to try banded solver? no.
sp\: is A triangular? no.
sp\: is A morally triangular? no.
sp\: is A a candidate for Cholesky (symmetric, real positive diagonal)? yes.
sp\: is CHOLMOD's symbolic Cholesky factorization (with automatic reordering) successful? yes.
sp\: is CHOLMOD's numeric Cholesky factorization successful? yes.
sp\: is CHOLMOD's triangular solve successful? yes.

ดังนั้นฉันจะเห็นว่า "\" จบลงด้วยการใช้ "CHOLMOD" ในกรณีนี้


3
+1 สำหรับการตั้งค่า MATLAB ใหม่ที่ฉันไม่เคยได้ยิน เล่นได้ดีครับ
Geoff Oxberry

2
เฮ้ขอบคุณ! help mldivideมันอยู่ใน
dranxo

16

สำหรับการฝึกอบรมเบาบาง Matlab ใช้ UMFPACK สำหรับ " \" การดำเนินการซึ่งในตัวอย่างของคุณโดยทั่วไปวิ่งผ่านค่าของa, bตีความพวกเขาและพวกเขาคูณกับค่านิยมของ สำหรับตัวอย่างนี้คุณควรใช้b./diag(a)ซึ่งเร็วกว่ามาก

สำหรับระบบที่มีความหนาแน่นผู้ใช้แบ็กสแลชนั้นค่อนข้างซับซ้อนกว่าเล็กน้อย คำอธิบายสั้น ๆ ของสิ่งที่จะทำเมื่อจะได้รับที่นี่ ในตัวอย่างของคุณ Matlab จะแก้ปัญหาa\bโดยใช้การแทนที่แบบย้อนหลัง สำหรับเมทริกซ์จตุรัสทั่วไปจะใช้ LU-decomposition


Regd Sparsity การรุกรานของเมทริกซ์ diag ก็จะเป็นส่วนกลับขององค์ประกอบในแนวทแยงดังนั้น b./diag(a) จะทำงานได้ แต่ \ b ทำงานได้อย่างยอดเยี่ยมสำหรับเมทริกซ์กระจัดกระจายทั่วไปเช่นกัน ทำไมไม่มี linsolve หรือ LULU (รุ่นที่ได้รับการปรับปรุง LU ของฉัน) ไม่เร็วกว่าที่ \ b สำหรับเมทริกซ์หนาแน่นในกรณีนั้น
สอบถาม

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

ค่อนข้าง. แต่ด้วยค่าสถานะ linsolve OPT ฉันกำหนดทุกสิ่งเพื่อกำหนดโครงสร้าง กระนั้น a \ b เร็วกว่า
สอบถาม

@ ไม่เป็นพิษทุกครั้งที่คุณเรียกใช้ฟังก์ชันผู้ใช้คุณทำให้เกิดค่าโสหุ้ย Matlab ทำทุกอย่างสำหรับแบ็กสแลชภายในเช่นการสลายตัวและการใช้งานทางด้านขวามือที่ตามมาซึ่งมีค่าใช้จ่ายน้อยมากและจะเร็วขึ้น tic; for k=1:100, a\b; end; tocนอกจากนี้ในการทดสอบของคุณคุณควรใช้มากกว่าเพียงแค่หนึ่งสายที่จะได้รับการกำหนดเวลาที่เชื่อถือได้เช่น
Pedro

5

ตามกฎของหัวแม่มือหากคุณมีเมทริกซ์ที่กระจัดกระจายของความซับซ้อนที่สมเหตุสมผล (เช่นมันไม่จำเป็นต้องเป็นลายฉลุ 5 จุด แต่อันที่จริงแล้วอาจเป็น discretization ของสมการสโตกส์ซึ่งเป็นจำนวนที่ไม่ใช่ศูนย์ต่อแถว ใหญ่กว่า 5) จากนั้นตัวแก้ปัญหาแบบเบาบางโดยตรงเช่น UMFPACK มักจะเป็นนักแก้ปัญหา Krylov ซ้ำแล้วซ้ำอีกถ้าปัญหาไม่ใหญ่กว่า 100,000 รอบที่ไม่รู้จัก

กล่าวอีกนัยหนึ่งสำหรับเมทริกซ์กระจัดกระจายส่วนใหญ่ที่เกิดจากการแยกย่อย 2d ตัวแก้ปัญหาโดยตรงเป็นทางเลือกที่เร็วที่สุด เฉพาะปัญหา 3 มิติที่คุณได้รับมากกว่า 100,000 unknowns อย่างรวดเร็วมันจำเป็นหรือไม่ที่จะต้องใช้ตัวแก้ซ้ำ


3
ยังไม่ชัดเจนสำหรับฉันว่าจะตอบคำถามนี้อย่างไร แต่ฉันก็มีปัญหากับข้อสมมติฐาน เป็นความจริงที่นักแก้ปัญหาโดยตรงมักจะทำงานได้ดีสำหรับปัญหา 2D ขนาดปานกลาง แต่นักแก้ปัญหาโดยตรงมักจะประสบปัญหาใน 3D ก่อนที่จะไม่ทราบ 100k (ตัวคั่นจุดสุดยอดมีขนาดใหญ่กว่า 2D มาก) นอกจากนี้ฉันอ้างว่าในกรณีส่วนใหญ่ (เช่นตัวดำเนินการรูปไข่) ตัวแก้ซ้ำสามารถทำได้เร็วกว่าตัวแก้โดยตรงแม้สำหรับปัญหา 2D ขนาดกลาง แต่อาจต้องใช้ความพยายามอย่างมากในการทำเช่น (ใช้ส่วนผสมที่เหมาะสมเพื่อทำหลายจุด) .
Jed Brown

1
หากปัญหาของคุณมีขนาดเล็กพอสมควรและคุณไม่ต้องการคิดเกี่ยวกับการออกแบบตัวแก้ปัญหาโดยปริยายหรือหากปัญหาของคุณนั้นยากมาก (เช่น Maxwell ความถี่สูง) และคุณไม่ต้องการอุทิศอาชีพของคุณเพื่อออกแบบนักแก้ปัญหาที่ดี ยอมรับว่านักแก้ปัญหาโดยตรงกระจัดกระจายเป็นตัวเลือกที่ดี
Jed Brown

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

@JedBrown: ใช่อาจจะมีความพยายามอย่างมากที่จะได้นักแก้ปัญหาซ้ำ ๆ เพื่อเอาชนะตัวแก้ปัญหาโดยตรงแม้สำหรับปัญหา 2 มิติขนาดเล็ก แต่ทำไมล่ะ สำหรับปัญหาเกี่ยวกับ <100k unknowns ตัวแก้ปัญหาแบบเบาบางโดยตรงใน 2d นั้นเร็วเพียงพอ สิ่งที่ฉันอยากจะพูดก็คือ: สำหรับปัญหาเล็ก ๆ น้อย ๆ อย่าใช้เวลากับคุณในการหาค่าพารามิเตอร์ที่ดีที่สุดเพียงแค่เอาแบล็กบ็อกซ์ออกมา
Wolfgang Bangerth

มีลำดับความแตกต่างของขนาดรันไทม์ระหว่างรูปทรงเรขาคณิตที่กระจัดกระจายของ Cholesky และ (อิงตามเมทริกซ์) สำหรับปัญหา 2D "ง่าย" ที่มี 100k dofs โดยใช้ลายฉลุ 5 จุด (~ 0.5 วินาทีเทียบกับ ~ 0.05 วินาที) หากลายฉลุของคุณใช้เพื่อนบ้านคนที่สอง (เช่น discretization ลำดับที่สี่, นิวตันสำหรับทางเลือกของการไหลแบบไม่เชิงเส้น, การทำให้เสถียร, ฯลฯ ) ขนาดของตัวคั่นจุดสุดยอดประมาณสองเท่า ๆ กันดังนั้นต้นทุนของการแก้ปัญหาโดยตรงเพิ่มขึ้นประมาณ 8 เท่า ปัญหาขึ้นอยู่กับ MG) ด้วยเวลาหลายขั้นตอนหรือการปรับให้เหมาะสม / ลูป UQ ความแตกต่างเหล่านี้มีความสำคัญ
Jed Brown
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.