เมทริกซ์มากเลขศูนย์

ไฟล์:Finite_element_sparse_matrix.png|thumb| เมทริกซ์มากเลขศูนย์ที่ได้เมื่อแก้ปัญหาด้วยระเบียบวิธีไฟไนต์เอลิเมนต์ในสองมิติ องค์ประกอบที่ไม่เป็นศูนย์จะเป็นสีดำ
ในสาขาการวิเคราะห์เชิงตัวเลข และ วิทยาการคอมพิวเตอร์ เมทริกซ์มากเลขศูนย์ (sparse matrix) หรือ แถวลำดับมากเลขศูนย์ (sparse array) หมายถึงเมทริกซ์ที่องค์ประกอบส่วนใหญ่เป็นศูนย์ ไม่มีคำจำกัดความที่แน่ชัดว่าต้องมีองค์ประกอบที่เป็นศูนย์อยู่มากเท่าไดจึงจะถือว่าเป็นเมทริกซ์ที่ มากเลขศูนย์ (sparse) แต่เงื่อนไขโดยทั่วไปคือจำนวนองค์ประกอบที่ไม่ใช่ศูนย์นั้นใกล้เคียงกับจำนวนแถวหรือสดมภ์โดยประมาณ ในทางกลับกัน เมทริกซ์ที่องค์ประกอบส่วนใหญ่ไม่เป็นศูนย์จะถือว่าเป็นเมทริกซ์ที่ หนาแน่น (dense) จำนวนองค์ประกอบที่เป็นศูนย์ในเมทริกซ์หารด้วยจำนวนองค์ประกอบทั้งหมด บางครั้งเรียกว่า ความมากเลขศูนย์ (sparsity) ของเมทริกซ์
ตามหลักการแล้ว ความมากเลขศูนย์จะเกิดขึ้นกับระบบที่มีการโต้ตอบแบบคู่กันเพียงเล็กน้อย ตัวอย่างเช่น ถ้าเราพิจารณาเส้นของลูกบอลที่เชื่อมต่อถึงกันด้วยสปริง นี่เป็นระบบแบบมากเลขศูนย์ เนื่องจากลูกบอลแต่ละลูกจะจับคู่กับตัวข้าง ๆ เท่านั้น ในทางตรงข้าม ระบบนี้จะเป็นเมทริกซ์หนาแน่น หากลูกบอลลูกหนึ่งเชื่อมต่อกันด้วยสปริงกับลูกบอลอีกลูกที่อยู่ในแนวเดียวกัน แนวคิดเรื่องความมากเลขศูนย์มีประโยชน์ในด้านการใช้งาน เช่น คณิตศาสตร์เชิงการจัด และ ทฤษฎีโครงข่าย และ การวิเคราะห์เชิงตัวเลข ซึ่งโดยปกติแล้วความหนาแน่นของข้อมูลสำคัญและการเชื่อมต่อจะต่ำ เมทริกซ์มากเลขศูนย์ขนาดใหญ่มักปรากฏในการประยุกต์ใช้ทางวิทยาศาสตร์ และ วิศวกรรมศาสตร์ เมื่อแก้สมการเชิงอนุพันธ์ย่อย
เมื่อจัดเก็บและจัดการเมทริกซ์แบบมากเลขศูนย์บนคอมพิวเตอร์ จะเป็นประโยชน์และมักจำเป็นต้องใช้ ขั้นตอนวิธีพิเศษและโครงสร้างข้อมูลที่ใช้ประโยชน์จากโครงสร้างแบบมากเลขศูนย์ของเมทริกซ์ เนื่องจากเมทริกซ์มากเลขศูนย์มักใช้ในด้านการเรียนรู้ของเครื่อง  บางเครื่องจึงอาจถูกสร้างขึ้นมาสำหรับเมทริกซ์แบบนี้โดยเฉพาะ การดำเนินการที่ใช้โครงสร้างเมทริกซ์หนาแน่นมาตรฐานจะช้าและไม่มีประสิทธิภาพเมื่อนำไปใช้กับเมทริกซ์มากเลขศูนย์ขนาดใหญ่ การสูญเสียการประมวลผลและหน่วยความจำไปกับค่าศูนย์ ข้อมูลมากเลขศูนย์จะบีบอัดได้ง่ายกว่าดังนั้นจึงใช้พื้นที่จัดเก็บน้อยกว่ามาก สำหรับเมทริกซ์มากเลขศูนย์ที่มีขนาดใหญ่มาก อาจเป็นไปได้ที่จะใช้การดำเนินการกับเมทริกซ์หนาแน่นมาตรฐาน
สมการเชิงอนุพันธ์ย่อยอรจถูกวิเคราะห์ได้โดยใช้ วิธีผลต่างอันตะ วิธีไฟไนต์เอลิเมนต์ ฯลฯ โดยทั่วไปจะกลายเป็น ระบบสมการเชิงเส้นที่มีเมทริกซ์มากเลขศูนย์ เป็นเมทริกซ์สัมประสิทธิ์
ในสาขาการวิเคราะห์เชิงตัวเลข มีวิธีการแก้ปัญหาหลายวิธีที่ใช้เมทริกซ์มากเลขศูนย์ การจัดเก็บเฉพาะองค์ประกอบที่ไม่ใช่ศูนย์ของเมทริกซ์มากเลขศูนย์อย่างชาญฉลาด จะช่วยให้จัดการกับปัญหามิติขนาดใหญ่ได้ง่ายขึ้น ข้อดีอีกประการหนึ่งคือ ตัวอย่างเช่น สามารถคำนวณผลคูณของเวกเตอร์และเมทริกซ์ได้โดยใช้ความพยายามเพียงเล็กน้อย ตัวประมวลผลเวกเตอร์นั้นใช้ได้ดีในการประมวลผลทางคอมพิวเตอร์โดยใช้เมทริกซ์มากเลขศูนย์ซึ่งมักจะเกี่ยวข้องกับการเข้าถึงหน่วยความจำแบบสุ่ม และยังคงเป็นกระบวนการที่ตัวประมวลผลแบบสเกลาร์ ทั่วไปและ GPGPU นั้นยังทำได้ไม่ค่อยดี

**รูปแบบการจัดเก็บข้อมูล**
โดยทั่วไปเมทริกซ์จะถูกเก็บไว้ในแถวลำดับสองมิติ แต่ละองค์ประกอบของแถวลำดับแสดงถึงองค์ประกอบ ai,j ของเมทริกซ์ และเข้าถึงได้โดยใช้ดัชนี สองตัว i และ j ตามแบบแผนทั่วไป i หมายถึงดัชนีแถวโดยนับจากบนลงล่าง และ j หมายถึงดัชนีสดมภ์โดยนับจากซ้ายไปขวา สำหรับเมทริกซ์ขนาด m × n จำนวนหน่วยความจำที่ต้องใช้ในการจัดเก็บเมทริกซ์ในรูปแบบนี้เป็นสัดส่วนกับ m × n (แม้ว่าจะมักลืมไปว่าขนาดของเมทริกซ์ก็ต้องถูกจัดเก็บด้วย)
ในกรณีของเมทริกซ์มากเลขศูนย์ การจัดเก็บเฉพาะองค์ประกอบที่ไม่เป็นศูนย์จะช่วยลดจำนวนหน่วยความจำที่ต้องการได้อย่างมาก การใช้โครงสร้างข้อมูลที่แตกต่างกันขึ้นอยู่กับจำนวนและการกระจายขององค์ประกอบที่ไม่ใช่ศูนย์ ช่วยให้ประหยัดหน่วยความจำได้มากเมื่อเทียบกับวิธีการพื้นฐาน ข้อเสียคือการเข้าถึงแต่ละองค์ประกอบนั้นซับซ้อนกว่า และจำเป็นต้องมีโครงสร้างเพิ่มเติมเพื่อให้สามารถกู้คืนเมทริกซ์ดั้งเดิมได้อย่างชัดเจน
ด้วยเหตุนี้ จึงมีรูปแบบไฟล์แบบต่าง ๆ สำหรับจัดเก็บเมทริกซ์มากเลขศูนย์
รูปแบบจะแบ่งออกเป็นสองกลุ่ม- รูปแบบที่รองรับการแก้ไขอย่างมีประสิทธิภาพ
** DOK (พจนานุกรมคีย์)
** LIL (รายการ)
** COO- รูปแบบที่รองรับการเข้าถึงที่มีประสิทธิภาพและการจัดการเมทริกซ์
** CSR
** CSC
** BSR
ชื่อต่อไปนี้เป็นไปตามที่ใช้ใน Netlib, Intel Math Kernel Library และ SciPy ให้พิจารณาเมทริกซ์มากเลขศูนย์ A ต่อไปนี้เป็นตัวอย่าง

**พจนานุกรมคีย์**
พจนานุกรมคีย์ (Dictionary of Key, DOK) เป็นวิธีการที่ใช้ (แถว, สดมภ์) เป็นคีย์และจัดเก็บไว้ในแถวลำดับแบบจับคู่

**รายการของรายการ**
รายการของรายการ (list of list, LIL) เป็นวิธีการที่สร้างรายการสำหรับแต่ละแถวและจัดเก็บสิ่งอันดับ (สดมภ์, ค่า) ในรายการนั้น

**พิกัด**
พิกัด (coordinate, COO) เป็นวิธีการแสดงเมทริกซ์เป็นชุดของหลายสิ่งอันดับ ค่า, ดัชนีแถว, ดัชนีสดมภ์
การจัดเรียงองค์ประกอบของเมทริกซ์ A พร้อมกับพิกัด (ดัชนี) จะให้ผลลัพธ์ดังนี้
A = 1 2 3 0 0 0 0 1 2 0 0 2 0 0 0 1 # ค่า
IA = 1 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 # ดัชนีแถว
JA = 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 # ดัชนีสดมภ์
ในที่นี้หากระบุว่า "ค่าที่ไม่มีอยู่จะถือเป็นองค์ประกอบศูนย์" องค์ประกอบที่เป็นศูนย์ทั้งหมดสามารถลบทิ้ง ซึ่งส่งผลให้ได้
A = 1 2 3 1 2 2 1 # ค่า
IA = 1 1 1 2 3 3 4 # ดัชนีแถว
JA = 1 2 3 4 1 4 4 # ดัชนีสดมภ์
เป็นการแทนด้วยเมทริกซ์มากเลขศูนย์ A ในรูปแบบ COO
หากต้องการแก้ไของค์ประกอบที่เป็นศูนย์ของเมทริกซ์ COO ให้ไม่เป็นศูนย์ ก็แค่ต้องเพิ่มหลายสิ่งอันดับที่ไม่เป็นศูนย์หลังจากนั้นเท่านั้น ซึ่งเป็นวิธีที่มีประสิทธิภาพ

**ที่เก็บข้อมูลแถวบีบอัด**
ที่เก็บข้อมูลแถวที่ถูกบีบอัด (compressed row storage, CRS) หรือ แถวมากเลขศูนย์บีบอัด (compressed sparse row, CSR) เป็นวิธีการบีบอัดแถวลำดับดัชนีแถว
ในวิธี CSR ขั้นแรกให้จัดเรียงเมทริกซ์สองมิติตามทิศทางของแถว ต่อไปจะพิจารณาว่า "ค่าที่ไม่มีอยู่จะถือเป็นองค์ประกอบศูนย์" และองค์ประกอบที่เป็นศูนย์ทั้งหมดจะถูกลบทิ้ง ในขั้นตอนนี้ หากจัดเรียงดัชนีด้วยแถวและสดมภ์ จะมีลักษณะดังนี้:
data = 1 2 3 1 2 2 1 # ค่า
IA = 1 1 1 2 3 3 4 # ดัชนีแถว
JA = 1 2 3 4 1 4 4 # ดัชนีสดมภ์
ในที่นี้เราจะมุ่งความสนใจไปที่แถวลำดับดัชนีแถว (IA) ในปัจจุบัน แต่ละองค์ประกอบมีดัชนีแถวที่ชัดเจน แต่สามารถรับมาได้โดยอัตโนมัติหากทราบการแบ่งแถว ตัวอย่างเช่น IA1 = IA2 = IA3 = 1 แต่ถ้ารู้ว่า "บรรทัดแรกเริ่มจากองค์ประกอบแรก และบรรทัดที่ 2 เริ่มจากองค์ประกอบที่ 4" ดังนั้นจะได้ว่า IA1:4=1 1 1 ในทันที นี่เป็นผลมาจากกฎที่ว่าวิธี CSR จัดเรียงทีละแถวแล้วลบองค์ประกอบที่เป็นศูนย์
การแสดงดัชนีแถวนี้สามารถมองได้ว่าเป็นแถวลำดับของตัวชี้ส่วนหัวของแถว นั่นคือ indptr = ptr_row_1 ptr_row2 ... ขณะนี้แถวลำดับดัชนีสดมภ์ JA เป็นเพียงแถวลำดับเดียวที่ระบุดัชนีโดยตรง ดังนั้นจะเปลี่ยนชื่อเป็น indices ซึ่งจะได้ว่า
data = 1 2 3 1 2 2 1 # ค่า
indices = 1 2 3 4 1 4 4 # ดัชนีสดมภ์
indptr = 1 4 5 7 # ตัวชี้แถว
นี่เป็นการแสดงเมทริกซ์มากเลขศูนย์ A ในรูปแบบ CSR
รูปแบบ CSR ช่วยให้เข้าถึงแถวได้ดีขึ้น เมื่อเข้าถึงแถวแรกสามารถดึงเอาข้อมูลโดย dataindptr1:indptr2 และดัชนีสดมภ์ที่มี indicesindptr1:indptr2 (ดัชนีแถวคือ 1 แน่นอน) ในขณะที่ ในรูปแบบ COO ขั้นแรกจะกวาดดูความยาวทั้งหมดของแถวลำดับดัชนีแถว IA แสดงรายการหมายเลของค์ประกอบ k ที่สอดคล้องกับ IAk == 1 จากนั้นจะต้องทำการเข้าถึง k ทั้งหมดโดยใช้ datak, indicesk
ในทางตรงกันข้าม รูปแบบ CSR ทำให้เข้าถึงสดมภ์ได้ไม่ดี เมื่อต้องการเข้าถึงสดมภ์แรก ต้องกวาดหา indices ตามความยาวทั้งหมด และแสดงรายการหมายเลของค์ประกอบ k ที่ indicesk == 1 จากนั้นกวาดหา indptr เพื่อให้ได้ดัชนีแถว และต้องค้นหา n ที่ทำให้ indptrn  ที่แต่ละ k

**ที่เก็บข้อมูลสดมภ์บีบอัด**
ที่เก็บข้อมูลสดมภ์บีบอัด (compressed column storage, CCS) หรือ สดมภ์มากเลขศูนย์บีบอัด (compressed sparse Column, CSC) จะเหมือนกับ CRS แต่อิงสดมภ์แทนที่จะอิงแถว

**ที่เก็บข้อมูลแนวทแยงบีบอัด**
ที่เก็บข้อมูลแนวทแยงบีบอัด (compressed diagonal storage, CDS) และ diagonal (DIA) เป็นรูปแบบ CRS/CSR ในหน่วยเมทริกซ์แนวทแยง

**เมทริกซ์เส้นขอบฟ้า (SKS, SKY)**
เมทริกซ์เส้นขอบฟ้า (skyline matrix) ใช้สำหรับเมทริกซ์สามเหลี่ยม

**ที่จัดเก็บแถวบีบอัดแบบบล็อก**
ที่จัดเก็บแถวบีบอัดแบบบล็อก (block compressed row storage, BCRS) หรือ แถวมากเลขศูนย์แบบบล็อก (Block Sparse Row, BSR) เหมือนกับ CRS แต่ทำเป็นในหน่วยบล็อก

**อ้างอิง**
หมวดหมู่:พีชคณิตเชิงเส้นตัวเลข
หมวดหมู่:เมทริกซ์