首页 > 试题广场 >

矩阵乘法

[编程题]矩阵乘法
  • 热度指数:6554 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定两个 n*n 的矩阵 A 和 B ,求 A*B 。

数据范围:

要求:空间复杂度 , 时间复杂度
进阶:本题也有空间复杂度 ,时间复杂度 的解法
PS:更优时间复杂度的算法这里并不考察
示例1

输入

[[1,2],[3,2]],[[3,4],[2,1]]

输出

[[7,6],[13,14]]
示例2

输入

[[1]],[[1]]

输出

[[1]]
public int[][] solve (int[][] a, int[][] b) {
    // write code here
    int m=a.length;
    int[][] res=new int[m][m];
    for(int i=0;i<m;i++){
        for(int j=0;j<m;j++){
            for(int k=0;k<m;k++){
                res[i][k]+=a[i][j]*b[j][k];
            }
        }
    }
    return res;
}

编辑于 2024-03-17 13:39:01 回复(0)
支持:MXN矩阵乘以NXP矩阵=MXP
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * @param a int整型二维数组 第一个矩阵
     * @param b int整型二维数组 第二个矩阵
     * @return int整型二维数组
     */
    public int[][] solve(int[][] a, int[][] b) {
        // write code here
        // 矩阵乘法等于矩阵行乘矩阵列
        // mXn矩阵乘nXp矩阵=mXp矩阵
        int[][] res = new int[a.length][b[0].length];
        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < a[i].length; j++) {
                for (int k = 0; k < b[j].length; k++) {
                    res[i][k] += a[i][j] * b[j][k];
                }
            }
        }
        return res;
    }
}


发表于 2022-04-16 22:34:25 回复(0)
public int[][] solve (int[][] a, int[][] b) {
    int n = a.length;
    int[][] res = new int[n][n];
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            for (int k = 0; k < n; k++) {
                res[i][j] += a[i][k] * b[k][j];
            }
        }
    }
    return res;
}

发表于 2022-01-23 12:11:04 回复(0)
import java.util.*;
//六刷
public class Solution {

    public int[][] solve (int[][] a, int[][] b) {
        int len=a.length;
        if (len == 0) return null;
        int[][] res = new int[len][len];
        
//         boolean flag=true;
//         for (int row = 0; row < len; row++) {
//             for (int col = 0; col < len; col++) {
//                 if(a[row][col]!=0){
//                     flag=false;
//                     break;
//                 }
//             }
//         }
//         if(flag==true)return a;
        
        for (int row = 0; row < len; row++) {
            for (int col = 0; col < len; col++) {
                res[row][col] = matrixMul(a, b, row, col);
            }
        }
        return res;
    }

    // 第一个矩阵 i 行和第二个矩阵 j 列的乘积
    public int matrixMul (int[][] a, int[][] b, int row, int col) {
        int result = 0;
        int le=a.length;
        for (int k = 0; k < le; k++) {
            result += a[row][k] * b[k][col];
        }
        return result;
    }
}

发表于 2021-10-01 17:34:21 回复(0)
题解里数组读取顺序的优化也超时啊,有人解决了吗?
发表于 2021-08-13 00:28:46 回复(0)
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param a int整型二维数组 第一个矩阵
     * @param b int整型二维数组 第二个矩阵
     * @return int整型二维数组
     */
    public int[][] solve (int[][] a, int[][] b) {
        // write code here
        // [1,2     [1,2
        //  3,4] *   3,4]
        int n = a.length;
        int[][] ans = new int[n][n];
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < n; j++) {
                for(int k = 0; k < n; k++) {
                    ans[i][j] += a[i][k] * b[k][j];
                }
            }
        }
        return ans;
    }
}

发表于 2021-07-31 17:36:40 回复(0)
    public int[][] solve (int[][] a, int[][] b) {
        int n=a.length;
        int[][]res=new int[n][n];
        for(int x=0;x<n;x++){
            for(int y=0;y<n;y++){
                int sum=0;
                for(int i=0;i<n;i++){
                  sum+=(a[x][i]*b[i][y]);
                    
                }
                res[x][y]=sum;
            }
        }
        return res;
    }

发表于 2021-03-27 10:26:53 回复(0)
import java.util.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param a int整型二维数组 第一个矩阵
     * @param b int整型二维数组 第二个矩阵
     * @return int整型二维数组
     */
    public int[][] solve (int[][] a, int[][] b) {
        if (a.length == 0 || b.length == 0) return null;

        int[][] res = new int[a.length][a[0].length];
        for (int row = 0; row < a.length; row++) {
            for (int col = 0; col < a[0].length; col++) {
                res[row][col] = matrixMul(a, b, row, col);
            }
        }
        return res;
    }

    // 第一个矩阵 i 行和第二个矩阵 j 列的乘积
    public int matrixMul (int[][] a, int[][] b, int row, int col) {
        int result = 0;
        for (int k = 0; k < a.length; k++) {
            result += a[row][k] * b[k][col];
        }
        return result;
    }
}
发表于 2020-12-20 19:25:10 回复(1)
有更好的方法吗?
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param a int整型二维数组 第一个矩阵
     * @param b int整型二维数组 第二个矩阵
     * @return int整型二维数组
     */
    public int[][] solve (int[][] a, int[][] b) {
        // write code here
        if(a == null || a.length == 0 || b == null || b.length == 0){return new int[0][0];}
        int am = a.length;
        int an = a[0].length;
        int bm = b.length;
        int bn = b[0].length;
        int[][] res = new int[am][bn];
        for(int i = 0; i < am; ++i){
            for(int j = 0; j < bn; ++j){
                int sum = 0;
                for(int k = 0; k < an; ++k){
                    sum += a[i][k] * b[k][j];
                }
                res[i][j] = sum;
            }
        }
        return res;
    }
}


发表于 2020-12-14 23:48:31 回复(1)