Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में गॉस-जॉर्डन विधि का उपयोग करके मैट्रिक्स का व्युत्क्रम खोजना

समस्या विवरण

इस समस्या में, हमें एक 2D मैट्रिक्स mat[][] दिया गया है। हमारा कार्य गॉस-जॉर्डन विधि का उपयोग करके मैट्रिक्स का व्युत्क्रम खोजना है।

आधारभूत अवधारणाएं

मैट्रिक्स संख्याओं की दो-आयामी सरणी है।

उदाहरण

[ 2  5  4 ]
[ 1  6  7 ]
[ 9  3  8 ]

मैट्रिक्स का व्युत्क्रम [A⁻¹] - यह वर्ग मैट्रिक्स पर किया जाने वाला एक ऑपरेशन है। मैट्रिक्स के व्युत्क्रम के लिए निम्नलिखित गुण आवश्यक हैं:

  • प्रारंभिक मैट्रिक्स वर्ग मैट्रिक्स होना चाहिए
  • यह गैर-विलक्षण (non-singular) मैट्रिक्स होना चाहिए
  • मैट्रिक्स A के लिए एक पहचान मैट्रिक्स I मौजूद होना चाहिए जैसे कि: AA⁻¹ = A⁻¹A = I

किसी भी दिए गए मैट्रिक्स का व्युत्क्रम खोजने के लिए एक सूत्र है:

A⁻¹ = adj(A) / det(A)

जहां adj(A) मैट्रिक्स A का सहखंडज (adjoint) है और det(A) मैट्रिक्स A का सारणिक (determinant) है।

मैट्रिक्स का व्युत्क्रम खोजने के कई तरीके हैं। इस लेख में, हम गॉस-जॉर्डन विधि के बारे में सीखेंगे जिसे प्राथमिक पंक्ति संक्रिया (Elementary Row Operation) के रूप में भी जाना जाता है।

गॉस-जॉर्डन विधि के चरण

  1. वर्धित मैट्रिक्स बनाएं पहचान मैट्रिक्स का उपयोग करके
  2. पंक्ति न्यूनीकरण ऑपरेशन करके वर्धित मैट्रिक्स का एशेलॉन रूप खोजें
  3. ऑपरेशन जो किए जा सकते हैं:
    • पंक्ति अदला-बदली (किसी भी दो पंक्तियों को आपस में बदल सकते हैं)
    • गुणा (पंक्ति के प्रत्येक तत्व को 0 के अलावा किसी स्थिर मान से गुणा कर सकते हैं)
    • पंक्ति प्रतिस्थापन (पंक्ति को उस पंक्ति और मैट्रिक्स की किसी अन्य पंक्ति के स्थिर गुणक के योग से बदल सकते हैं)

C++ कार्यान्वयन

#include <iostream> 
#include <vector> 
#include <cstdio> 
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;
    }
}

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;
    }
}

void findInvMatGaussJordan(float** mat, int order) {
    float temp;
    printf("मैट्रिक्स का व्युत्क्रम: 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* tempRow = mat[i];
            mat[i] = mat[i - 1];
            mat[i - 1] = tempRow;
        }
    }
    
    // गॉस-जॉर्डन एलिमिनेशन
    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;
                }
            }
        }
    }
    
    // विकर्ण को 1 बनाएं
    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);
}

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;
}

आउटपुट

मैट्रिक्स का व्युत्क्रम: 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

जटिलता विश्लेषण

  • समय जटिलता: O(N³)
  • स्पेस जटिलता: O(N²)

महत्वपूर्ण नोट्स

  • केवल वर्ग और गैर-विलक्षण (सारणिक ≠ 0) मैट्रिक्स के लिए काम करता है
  • संख्यात्मक स्थिरता के लिए आंशिक पिवटिंग की सिफारिश की जाती है
  • उत्पादन कोड के लिए, लैपैक जैसे पुस्तकालयों का उपयोग करें
  1. OpenCV में C++ का उपयोग करके रंग स्थान कैसे परिवर्तित करें? OpenCV में C++ का उपयोग करके रंग स्थान कैसे परिवर्तित करें?

    रंग स्थान रंगों को दर्शाने का मॉडल है। रंगों का वर्णन करने के विभिन्न तरीके हैं। उदाहरण के लिए, RGB, CYMK, HSV, ग्रेस्केल आदि। यहां, हमने imgproc.hpp नामक एक नए हेडर का उपयोग किया है। यह imgproc.hpp इमेज प्रोसेसिंग का संक्षिप्त नाम है। रंग स्थान परिवर्तित करने के लिए, हमें OpenCV के cvtColor() फ़ंक्

  1. C++ प्रोग्राम: इन्सिडेंस मैट्रिक्स का उपयोग करके ग्राफ प्रतिनिधित्व करना C++ प्रोग्राम: इन्सिडेंस मैट्रिक्स का उपयोग करके ग्राफ प्रतिनिधित्व करना

    एक ग्राफ का इन्सिडेंस मैट्रिक्स ग्राफ को मेमोरी में स्टोर करने का एक और प्रतिनिधित्व है। यह मैट्रिक्स एक वर्ग मैट्रिक्स नहीं है। इन्सिडेंस मैट्रिक्स का ऑर्डर V x E होता है। जहां V वर्टेक्स की संख्या है और E ग्राफ में एज की संख्या है। इस मैट्रिक्स की प्रत्येक पंक्ति में हम वर्टेक्स रखते हैं, और प्रत

  1. C++ प्रोग्राम: एडजेसेंसी मैट्रिक्स का उपयोग करके ग्राफ प्रतिनिधित्व करना C++ प्रोग्राम: एडजेसेंसी मैट्रिक्स का उपयोग करके ग्राफ प्रतिनिधित्व करना

    एक ग्राफ का एडजेसेंसी मैट्रिक्स V x V आकार का एक वर्ग मैट्रिक्स होता है। V ग्राफ G के वर्टेक्स की संख्या है। इस मैट्रिक्स में प्रत्येक तरफ V वर्टेक्स मार्क किए जाते हैं। यदि ग्राफ में i से j वर्टेक्स तक कुछ एज हैं, तो एडजेसेंसी मैट्रिक्स में i-वीं पंक्ति और j-वें कॉलम में 1 होगा (या वेटेड ग्राफ के