ম্যাট্রিক্স মাল্টিপ্লিকেশন (Matrix Multiplication)
এখন ম্যাট্রিক্স মাল্টিপ্লিকেশনের প্রসেস আলোচনা করা হচ্ছে। ম্যাট্রিক্স মাল্টিপ্লিকেশন শুধু তখনই করা যায় যদি কিছু শর্ত পূরণ হয়। ধরুন দুটি ম্যাট্রিক্স P এবং Q, এবং তাদের ডাইমেনশন যথাক্রমে P (a x b) এবং Q (z x y)। রেজাল্ট্যান্ট ম্যাট্রিক্স তখনই বের করা যায় যদি b = x হয়। তখন রেজাল্ট্যান্ট ম্যাট্রিক্স R-এর অর্ডার হবে (a x y)।
আলগরিদম (Algorithm)
matrixMultiply(P, Q):
Assume dimension of P is (a x b), dimension of Q is (z x y)
Begin
if b is not same as z, then exit
otherwise define R matrix as (a x y)
for i in range 0 to a - 1, do
for j in range 0 to y - 1, do
for k in range 0 to z, do
R[i, j] = R[i, j] + (P[i, k] * Q[k, j])
done
done
done
End
ম্যাট্রিক্স নরমালাইজেশন (Matrix Normalization)
ধরি আমাদের একটি 2x3 ম্যাট্রিক্স আছে: 4 5 6 1 2 3 নরমালাইজড ম্যাট্রিক্স হবে: 4/sqrt(5² + 6²) 5/sqrt(5² + 6²) 6/sqrt(5² + 6²) 1/sqrt(2² + 3²) 2/sqrt(2² + 3²) 3/sqrt(2² + 3²)
উদাহরণ (C প্রোগ্রাম)
#include <stdio.h>
#include <math.h>
int main() {
int row, col, row1, col1;
int assignMatrix[50][50], rowAdd[100] = {0};
long long int a, square[50] = {0};
double norm[50][50], k;
printf("Enter size of a matrix\n");
scanf("%d %d", &row, &col);
printf("Enter matrix of size %dX%d\n", row, col);
for (row1 = 0; row1 < row; row1++) {
for (col1 = 0; col1 < col; col1++) {
scanf("%d", &assignMatrix[row1][col1]);
}
}
printf("\nrows: %d cols: %d elements:\n", row, col);
for (row1 = 0; row1 < row; row1++) {
for (col1 = 0; col1 < col; col1++) {
printf("%d ", assignMatrix[row1][col1]);
}
printf("\n");
}
// প্রতিটি সারির বর্গের যোগফল (প্রথম এলিমেন্ট বাদে?)
for (row1 = 0; row1 < row; row1++) {
for (col1 = 1; col1 < col; col1++) { // নোট: col1=1 থেকে শুরু, ০ নয়
a = assignMatrix[row1][col1]; // বাগ: r, c ভেরিয়েবল ব্যবহার করা হয়েছে row1, col1 এর জায়গায়
square[row1] += a * a;
}
printf("Sum of squares of row %d: %lld\n", row1, square[row1]);
}
// নরমালাইজেশন
for (row1 = 0; row1 < row; row1++) {
k = 1.0 / sqrt(square[row1]);
for (col1 = 0; col1 < col; col1++) {
norm[row1][col1] = k * assignMatrix[row1][col1];
}
}
printf("\nNormalized Matrix:\n");
for (row1 = 0; row1 < row; row1++) {
for (col1 = 0; col1 < col; col1++) {
printf("%.3lf ", norm[row1][col1]);
}
printf("\n");
}
return 0;
}
আউটপুট
Enter size of a matrix 2 3 Enter matrix of size 2X3 4 5 6 1 2 3 rows: 2 cols: 3 elements: 4 5 6 1 2 3 Sum of squares of row 0: 61 Sum of squares of row 1: 13 Normalized Matrix: 0.512 0.640 0.768 0.277 0.555 0.832 Process returned 0 (0x0) execution time : 12.446 s Press any key to continue.
নোট: প্রোগ্রামের কোডে একটি বাগ আছে: লুপে a = assignMatrix[r][c]; লেখা আছে কিন্তু লুপ ভেরিয়েবল হলো row1 এবং col1। সঠিক হবে a = assignMatrix[row1][col1];। এছাড়া নরমালাইজেশন লজিকটি প্রতিটি সারির সব এলিমেন্টকে সারির বর্গের যোগফলের স্কোয়ার রুট দিয়ে ভাগ করে, যা একটি অসাধারণ নরমালাইজেশন পদ্ধতি (সাধারণত পুরো ম্যাট্রিক্সের নরম বা প্রতিটি সারি ভেক্টরের নরম দিয়ে ভাগ করা হয়)।