C++ – 矩阵乘积

给出两个矩阵A和B。
A的长是N1,宽是M1;B的 长是N2,宽是M2。

如果M1等于N2时,可以进行矩阵乘积,最后的结果是N1 X M2的矩阵。

#include <cstdio>
using namespace std;
int main() {
    int a11, a12, a13;
    int a21, a22, a23;
    int b11, b12;
    int b21, b22;
    int b31, b32;
    scanf("%d %d %d", &a11, &a12, &a13);
    scanf("%d %d %d", &a21, &a22, &a23);
    scanf("%d %d", &b11, &b12);
    scanf("%d %d", &b21, &b22);
    scanf("%d %d", &b31, &b32);
    printf("%d %d \n", a11 * b11 + a12 * b21 + a13 * b31, 
               a11 * b12 + a12 * b22 + a13 * b32);
    printf("%d %d \n", a21 * b11 + a22 * b21 + a23 * b31, 
               a21 * b12 + a22 * b22 + a23 * b32);
    return 0;
}

基础操作

题目链接

#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 12;
struct Mat {
    int mat[MAXN][MAXN];
    int n, m;
    Mat operator * (const Mat &b) const {
        Mat a = *this;
        Mat ans;
        ans.n = a.n;
        ans.m = b.m;
        memset(ans.mat, 0, sizeof ans.mat);
        for(int i = 0; i < ans.n; i++) 
            for(int j = 0; j < ans.m; j++) 
                for(int k = 0; k < a.m; k++) 
                    ans.mat[i][j] += a.mat[i][k] * b.mat[k][j];
        return ans;
    }
    void scan() {
        for(int i = 0; i < n; i++)
            for(int j = 0; j < m; j++)
                scanf("%d", &mat[i][j]);
    }
    void print() {
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < m; j++) {
                printf("%d ", mat[i][j]);
            }
            printf("\n");
        }
    }
    Mat qpow(int k) {
        Mat ans;
        ans.n = n;
        ans.m = m;
        for(int i = 0; i < ans.n; i++) {
            for(int j = 0; j < ans.m; j++) {
                ans.mat[i][j] = (i == j);
            }
        }
        while(k) {
            if(k & 1)
                ans = ans * *this;
            *this = *this * *this;
            k >>= 1;
        }
        return ans;
    }
};
int main() {
    Mat m;
    int n, k;
    scanf("%d %d", &n, &k);
    m.n = m.m = n;
    m.scan();
    Mat ans = m.qpow(k);
    ans.print();
    return 0;
}

发表回复