ภาพรวม
การคูณเมทริกซ์ (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;
}
});