কম্পিউটার টিউটোরিয়াল

C++ দিয়ে গাস জর্ডান মেথড (Gauss Jordan Method) ব্যবহার করে ম্যাট্রিক্সের ইনভার্স (Inverse) বের করা


এই সমস্যাতে, আমাদের একটি ২D ম্যাট্রিক্স mat[][] দেওয়া আছে। আমাদের কাজ হল গাস জর্ডান মেথড (Gauss Jordan Method) ব্যবহার করে ম্যাট্রিক্সের ইনভার্স (Inverse) বের করা।

এখন, সমস্যা বেসিক বুঝি নিই,

ম্যাট্রিক্স (MATRIX) হল সংখ্যার একটি টু-ডাইমেনশনাল অ্যারে।

উদাহরণ

$\begin{bmatrix}2&5&4 \\1&6&7 \\9&3&8\end{bmatrix}$

ম্যাট্রিক্সের ইনভার্স [A-1] -

এটি একটি স্কোয়ার ম্যাট্রিক্সে করা একটি অপারেশন। নিচের প্রোপার্টিগুলো থাকলে একটি ম্যাট্রিক্সের ইনভার্স থাকে -

  • প্রাথমিক ম্যাট্রিক্স স্কোয়ার ম্যাট্রিক্স হতে হবে।

  • এটিকে নন-সিঙ্গুলার ম্যাট্রিক্স হতে হবে।

  • ম্যাট্রিক্স A-এর জন্য একটি আইডেন্টিটি ম্যাট্রিক্স I থাকতে হবে যাতে,

$$AA^{-1} = A^{-1}.A = I$$

কোনো ম্যাট্রিক্সের ইনভার্স বের করার একটি ফর্মুলা আছে। সেটি হল

$A^{-1}\:=\:\left(\frac{adj(A)}{\det(A)}\right)$

adj(A) হল ম্যাট্রিক্স A-এর অ্যাডজয়েন্ট (adjoint)

det(A) হল ম্যাট্রিক্স A-এর ডিটারমিন্যান্ট (determinant)।

ম্যাট্রিক্সের ইনভার্স বের করার একাধিক পদ্ধতি আছে। এই আর্টিকেলে, আমরা গাস জর্ডান মেথড শিখব যেটাকে ইলিমেন্টারি রো অপারেশন (Elementary Row Operation) বলা হয়।

এটি ম্যাট্রিক্সের ইনভার্স বের করার একটি ধাপে ধাপে পদ্ধতি। ধাপগুলো হল -

  • আইডেন্টিটি ম্যাট্রিক্স ব্যবহার করে অগমেন্টেড ম্যাট্রিক্স (augmented matrix) বের করা।

  • অগমেন্টেড ম্যাট্রিক্সে রো রিডাকশন অপারেশন পারফর্ম করে ইশেলন ফর্ম (echelon form) বের করা।

  • প্রক্রিয়ায় অগমেন্টেড ম্যাট্রিক্সে যেসব অপারেশন করা যায়:

    • রো ইন্টারচেঞ্জ (যেকোনো দুটি রো ইন্টারচেঞ্জ করা যায়)

    • মাল্টিপ্লিকেশন (রোর প্রতিটি এলিমেন্ট একটি কনস্ট্যান্ট ভ্যালু (০ ছাড়া) দিয়ে গুণ করা যায়)।

    • রো ইন্টারচেঞ্জ (রোকে ওই রো এবং ম্যাট্রিক্সের অন্য একটি রোর কনস্ট্যান্ট মাল্টিপ্লের যোগফল দিয়ে রিপ্লেস করা)।

উদাহরণ

#include <iostream> #include <vector> using namespace std; void printMatrixValues(float** arr, int n, int m){ for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cout<<arr[i][j]<<"\t"; } cout<<endl; } return; } void printInverseMatrix(float** arr, int n, int m){ for (int i = 0; i < n; i++) { for (int j = n; j < m; j++) { printf("%.3f\t", arr[i][j]); } cout<<endl; } return; } void findInvMatGaussJordan(float** mat, int order){ float temp; printf("The inverse of matrix : A = \n"); printMatrixValues(mat, order, order); for (int i = 0; i < order; i++) { for (int j = 0; j < 2 * order; j++) { if (j == (i + order)) mat[i][j] = 1; } } for (int i = order - 1; i > 0; i--) { if (mat[i - 1][0] < mat[i][0]) { float* temp = mat[i]; mat[i] = mat[i - 1]; mat[i - 1] = temp; } } for (int i = 0; i < order; i++) { for (int j = 0; j < order; j++) { if (j != i) { temp = mat[j][i] / mat[i][i]; for (int k = 0; k < 2 * order; k++) { mat[j][k] -= mat[i][k] * temp; } } } } for (int i = 0; i < order; i++) { temp = mat[i][i]; for (int j = 0; j < 2 * order; j++) { mat[i][j] = mat[i][j] / temp; } } cout<<"A' =\n"; printInverseMatrix(mat, order, 2 * order); return; } int main(){ int order = 3; float** mat = new float*[20]; for (int i = 0; i < 20; i++) mat[i] = new float[20]; mat[0][0] = 6; mat[0][1] = 9; mat[0][2] = 5; mat[1][0] = 8; mat[1][1] = 3; mat[1][2] = 2; mat[2][0] = 1; mat[2][1] = 4; mat[2][2] = 7; findInvMatGaussJordan(mat, order); return 0; }

আউটপুট

The inverse of matrix : A = 6 9 5 8 3 2 1 4 7 A' = -0.049 0.163 -0.011 0.205 -0.141 -0.106 -0.110 0.057 0.205

  1. OpenCV-এ C++ ব্যবহার করে কালার স্পেস কনভার্ট করা

  2. C++ প্রোগ্রাম: ইনসিডেন্স ম্যাট্রিক্স ব্যবহার করে গ্রাফ রিপ্রেজেন্টেশন

  3. C++ প্রোগ্রাম: অ্যাডজেসেন্সি ম্যাট্রিক্স ব্যবহার করে গ্রাফ রিপ্রেজেন্টেশন

  4. মাল্টি-ডাইমেনশনাল অ্যারে ব্যবহার করে দুটি ম্যাট্রিক্স গুণ করার C++ প্রোগ্রাম