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

C++ में स्पार्स मैट्रिक्स गुणा - अनुकूलित मैट्रिक्स गुणन


समस्या विवरण

मान लीजिए हमारे पास दो मैट्रिक्स A और B हैं, हमें AB का परिणाम ढूंढना है। हम मान सकते हैं कि A का स्तंभ संख्या B की पंक्ति संख्या के बराबर है।

उदाहरण के लिए, यदि इनपुट [[1,0,0],[-1,0,3]] और [[7,0,0],[0,0,0],[0,0,1]] है:

100
-103


700
000
001

तो आउटपुट [[7,0,0],[-7,0,3]] होगा:

700
-703

समाधान दृष्टिकोण

स्पार्स मैट्रिक्स प्रतिनिधित्व का उपयोग करके केवल गैर-शून्य तत्वों को प्रोसेस करें:

  1. r1 := A का आकार, r2 := B का आकार
  2. c1 := A[0] का आकार, c2 := B[0] का आकार
  3. क्रम r1 x c2 की 2D सरणी ret परिभाषित करें
  4. पेयर्स की सरणी sparseA[r1] परिभाषित करें
  5. i को 0 से r1-1 तक:
    • j को 0 से c1-1 तक:
      • यदि A[i][j] != 0, तो {j, A[i][j]} को sparseA[i] में जोड़ें
  6. i को 0 से r1-1 तक:
    • sparseA[i] के प्रत्येक पेयर के लिए:
      • k को 0 से c2-1 तक:
        • x := पेयर का पहला तत्व (स्तंभ सूचकांक)
        • यदि B[x][k] != 0, तो ret[i][k] += पेयर का दूसरा तत्व * B[x][k]
  7. ret लौटाएं

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

class Solution { 
public: 
    vector<vector<int>> multiply(vector<vector<int>>& A, vector<vector<int>>& B) { 
        int r1 = A.size(); 
        int r2 = B.size(); 
        int c1 = A[0].size(); 
        int c2 = B[0].size(); 
        vector < vector <int> > ret(r1, vector <int> (c2)); 
        vector < pair <int, int> > sparseA[r1]; 
        for(int i = 0; i < r1; i++){ 
            for(int j = 0; j < c1; j++){ 
                if(A[i][j] != 0)sparseA[i].push_back({j, A[i][j]}); 
            } 
        } 
        for(int i = 0; i < r1; i++){ 
            for(int j = 0; j < sparseA[i].size(); j++){ 
                for(int k = 0; k < c2; k++){ 
                    int x = sparseA[i][j].first; 
                    if(B[x][k] != 0){ 
                        ret[i][k] += sparseA[i][j].second * B[x][k]; 
                    } 
                } 
            } 
        } 
        return ret; 
    } 
};

इनपुट

{{1,0,0},{-1,0,3}},{{7,0,0},{0,0,0},{0,0,1}}

आउटपुट

[[7, 0, 0, ],[-7, 0, 3, ],]
  1. - C प्रोग्राम: स्पार्स मैट्रिक्स जांच

    स्पार्स मैट्रिक्स क्या है? एक मैट्रिक्स जिसमें अधिकांश एलिमेंट्स शून्य हों, स्पार्स मैट्रिक्स कहलाता है। उदाहरण (3x3) 1 0 0 0 2 0 0 0 0 9/2 = 4.5), इसलिए स्पार्स है। एल्गोरिदम रोज और कॉलम इनपुट लें। मैट्रिक्स एलिमेंट्स पढ़ें। शून्य एलिमेंट्स गिनें। (rows * cols) / 2 तो स्पार्स, अन्यथा नहीं। C

  1. C++ में मैट्रिक्स की पंक्ति-वार बनाम स्तंभ-वार ट्रैवर्सल C++ में मैट्रिक्स की पंक्ति-वार बनाम स्तंभ-वार ट्रैवर्सल

    एक मैट्रिक्स को दो तरीकों से ट्रैवर्स किया जा सकता है। पंक्ति-वार ट्रैवर्सल प्रत्येक पंक्ति को एक-एक करके पहले पंक्ति से शुरू करके अंतिम पंक्ति तक देखता है। पंक्ति में तत्व इंडेक्स 0 से अंतिम इंडेक्स तक लौटाए जाते हैं। स्तंभ-वार ट्रैवर्सल में, तत्वों को पहले स्तंभ से अंतिम स्तंभ तक क्रम में ट्रैवर्स

  1. C++ में स्ट्रासेन के मैट्रिक्स समीकरण को याद रखने का आसान तरीका C++ में स्ट्रासेन के मैट्रिक्स समीकरण को याद रखने का आसान तरीका

    यह एक मैट्रिक्स गुणन एल्गोरिदम है जो विभाजन और विजय विधि पर आधारित है। इसका उपयोग समान आकार के दो मैट्रिक्स को गुणा करने के लिए किया जाता है। दो मैट्रिक्स का गुणनफल ज्ञात करना: स्ट्रासेन का एल्गोरिदम गुणन को सरल बनाकर गुणन के लिए ओवरहेड को कम करता है। यहां स्ट्रासेन के एल्गोरिदम का उपयोग करके क