Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

โปรแกรมคูณเมทริกซ์ใน C#

ภาพรวม

การคูณเมทริกซ์ (Matrix Multiplication) เป็นการดำเนินการทางคณิตศาสตร์ที่คูณเมทริกซ์สองตัวเข้าด้วยกัน ได้ผลลัพธ์เป็นเมทริกซ์ใหม่ เงื่อนไข: จำนวนคอลัมน์ของเมทริกซ์แรก ต้องเท่ากับ จำนวนแถวของเมทริกซ์ที่สอง (คือ n = p)

หากเมทริกซ์ A มีขนาด m×n และเมทริกซ์ B มีขนาด p×q ผลลัพธ์จะมีขนาด m×q โดยที่ n ต้องเท่ากับ p

สูตรคำนวณ

องค์ประกอบที่ตำแหน่ง [i, j] ของเมทริกซ์ผลลัพธ์ C คำนวณได้จาก:

C[i, j] = Σ (A[i, k] × B[k, j])  สำหรับ k = 0 ถึง n-1

ตัวอย่างโปรแกรม

using System;

namespace MatrixMultiplicationDemo
{
    class Example
    {
        static void Main(string[] args)
        {
            // เมทริกซ์ A: 2×3, เมทริกซ์ B: 3×3
            int m = 2, n = 3, p = 3, q = 3;
            int[,] a = { { 1, 4, 2 }, { 2, 5, 1 } };
            int[,] b = { { 3, 4, 2 }, { 3, 5, 7 }, { 1, 2, 1 } };
            
            Console.WriteLine("เมทริกซ์ A:");
            PrintMatrix(a, m, n);
            
            Console.WriteLine("เมทริกซ์ B:");
            PrintMatrix(b, p, q);
            
            // ตรวจสอบเงื่อนไขการคูณ
            if (n != p)
            {
                Console.WriteLine("ไม่สามารถคูณเมทริกซ์ได้ (คอลัมน์ A ≠ แถว B)");
                return;
            }
            
            // เมทริกซ์ผลลัพธ์ C: 2×3
            int[,] c = new int[m, q];
            
            // คูณเมทริกซ์
            for (int i = 0; i < m; i++)
            {
                for (int j = 0; j < q; j++)
                {
                    c[i, j] = 0;
                    for (int k = 0; k < n; k++)
                    {
                        c[i, j] += a[i, k] * b[k, j];
                    }
                }
            }
            
            Console.WriteLine("ผลคูณของเมทริกซ์ทั้งสอง:");
            PrintMatrix(c, m, q);
        }
        
        static void PrintMatrix(int[,] matrix, int rows, int cols)
        {
            for (int i = 0; i < rows; i++)
            {
                for (int j = 0; j < cols; j++)
                    Console.Write(matrix[i, j] + "\t");
                Console.WriteLine();
            }
        }
    }
}

ผลลัพธ์

เมทริกซ์ A:
1       4       2
2       5       1

เมทริกซ์ B:
3       4       2
3       5       7
1       2       1

ผลคูณของเมทริกซ์ทั้งสอง:
17      28      32
22      35      40

การคำนวณตัวอย่าง (องค์ประกอบ C[0,0])

C[0,0] = A[0,0]×B[0,0] + A[0,1]×B[1,0] + A[0,2]×B[2,0]
       = 1×3 + 4×3 + 2×1
       = 3 + 12 + 2 = 17

การปรับปรุงประสิทธิภาพ (Optimization)

  • Cache-friendly: จัดลำดับลูปให้เข้าถึงหน่วยความจำแบบ sequential (i-k-j หรือ k-i-j)
  • Blocking/Tiling: แบ่งเมทริกซ์เป็นบล็อกเล็กๆ ให้เข้ากับ CPU cache
  • Parallel: ใช้ Parallel.For สำหรับลูปนอกสุด
  • SIMD: ใช้ System.Numerics.Vector หรือ Hardware Intrinsics
  • Library: ใช้ Math.NET Numerics, ILGPU, หรือ MKL สำหรับการคำนวณจริง

โค้ดแบบ Parallel (ตัวอย่าง)

using System.Threading.Tasks;

Parallel.For(0, m, i =>
{
    for (int j = 0; j < q; j++)
    {
        int sum = 0;
        for (int k = 0; k < n; k++)
            sum += a[i, k] * b[k, j];
        c[i, j] = sum;
    }
});