Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

Sparse Matrix Multiplication ใน 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

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนดังนี้ −

  • r1 := ขนาดของ A, r2 := ขนาดของ B

  • c1 := ขนาดของ A[0], c2 := ขนาดของ B[0]

  • กำหนดอาร์เรย์ 2 มิติ ret ขนาด r1 x c2

  • กำหนดอาร์เรย์ sparseA[r1] ของ pairs

  • ลูป i := 0 ถึง r1-1 ทำ −

    • ลูป j := 0 ถึง c1-1 ทำ −

      • ถ้า A[i][j] ไม่เท่ากับ 0 แล้ว −

        • แทรก { j, A[i][j] } ที่ท้ายของ sparseA[i]

  • ลูป i := 0 ถึง r1-1 ทำ −

    • ลูป j := 0 ถึงขนาดของ sparseA[i]-1 ทำ −

      • ลูป k := 0 ถึง c2-1 ทำ −

        • x := สมาชิกแรกของ sparseA[i][j]

        • ถ้า B[x][k] ไม่เท่ากับ 0 แล้ว −

          • ret[i][k] := ret[i][k] + สมาชิกที่สองของ sparseA[i][j] * B[x][k]

  • คืนค่า ret

ตัวอย่าง

ลองดูการติดตั้งต่อไปนี้เพื่อให้เข้าใจได้ดีขึ้น −

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, ],]