首页 > 试题广场 >

矩阵乘法

[编程题]矩阵乘法
  • 热度指数:80 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

请编写程序实现矩阵的乘法


输入描述:
输入的第一行包括3个数字 ,为 m,p,n
接下来的m行数据为第一个矩阵的数据,每个数据之间用英文逗号,分割
接下来的p行数据为第二个矩阵的数据,每个数据之间用英文逗号,分割


输出描述:
请输出矩阵相乘的结果,一行内的数据用英文逗号,拼接
示例1

输入

2,3,2
1,0,-1
1,1,-3
0,3
1,2
3,1

输出

-3,2
-8,2

备注:
请注意字符分割和拼接都使用英文逗号 , 输入和输出前后没有空行
import java.util.*;
public class Main {
        private static int[][] matrixMuilty(int[][] a, int[][] b) {
            int m = a.length, p = b.length, n = b[0].length;
            int[][] res = new int[m][n];
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    for (int k = 0; k < p; k++) {
                        res[i][j] += a[i][k] * b[k][j];
                    }
                }
            }
            return res;
        }

        //输入三个整数,分别表示:第一个矩阵的 行 列【也就是第二个矩阵的行】 第二个矩阵的列
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            String s = sc.nextLine();
            String[] ss = s.split(",");
            int m = Integer.parseInt(ss[0]), p = Integer.parseInt(ss[1]), n = Integer.parseInt(ss[2]);
            if (m == 0 || p == 0 || n == 0) {
                sc.close();
                return;
            }
            int[][] a = new int[m][p];
            int[][] b = new int[p][n];
            for (int i = 0; i < m; i++) {
                s = sc.nextLine();
                ss = s.split(",");
                for (int j = 0; j < p; j++) {
                    a[i][j] = Integer.parseInt(ss[j]);
                }
            }
            for (int i = 0; i < p; i++) {
                s = sc.nextLine();
                ss = s.split(",");
                for (int j = 0; j < n; j++) {
                    b[i][j] = Integer.parseInt(ss[j]);
                }
            }
            sc.close();
            int[][] res = matrixMuilty(a, b);
            for (int i = 0; i < m; i++) {
                StringBuilder sb = new StringBuilder();
                for (int j = 0; j < n; j++) {
                    sb.append(res[i][j]).append(",");
                }
                System.out.println(sb.substring(0, sb.length() - 1));
            }
        }
    }

发表于 2022-03-09 14:41:26 回复(0)
#include<bits/stdc++.h>
int main()
{
    int m, p, n,a[100][100] = { 0 }, b[100][100] = { 0 }, c[100][100] = {0};
	while(scanf("%d,%d,%d",&m,&p,&n)!=EOF) {
		for (int i = 0; i < m; i++)
			for (int j = 0; j < p; j++)
				scanf("%d%*c", &a[i][j]);
		for (int i = 0; i < p; i++)
			for (int j = 0; j < n; j++)
				scanf("%d%*c", &b[i][j]);		
		for (int i = 0; i < m; i++)
			for (int j = 0; j < n; j++)
				for (int k = 0; k < p; k++)
					c[i][j] += a[i][k] * b[k][j];
		for (int i = 0; i < m; i++) {
			for (int j = 0; j < n; j++) {
				printf("%d", c[i][j]);
				if (j != n - 1)
					printf(",");
				else
					printf("\n");
			}
		}
	}
}

发表于 2021-03-18 13:56:55 回复(0)
建一个fun做dot product,然后对B矩阵做transpose,然后用dot product求最终矩阵乘法的点的结果
def dot_product(x, y):
    sum = 0
    for i in range(len(x)):
        sum += x[i] * y[i]
    return sum

def transpose(x):
    i = len(x)
    j = len(x[0])
    res = []
    for k in range(j):
        temp = []
        for ele in x:
            temp.append(ele[k])
        res.append(temp)
    return res

while True:
    try:
        s = list(map(int,input().split(',')))
        x,y,z = s[0],s[1],s[2]
        A = []
        B = []
        for i in range(x):
            A.append(list(map(int, input().split(','))))
        for j in range(y):
            B.append(list(map(int, input().split(','))))
        for k in range(x):
            result = []
            for l in range(len(transpose(B))):
                result.append(dot_product(A[k], transpose(B)[l]))
            word = ','.join(list(map(str, result)))
            print(word)
    except:
        break

发表于 2021-02-05 10:27:03 回复(0)
    public static int[][] matrixMultiplication(int[][] A, int[][] B) throws Exception {
        if (A != null && B != null) {
            if (A[0].length != B.length) {
                throw new Exception("A的列数和B的行数不相等,请确认后再尝试计算");
            }
            int[][] C = new int[A.length][B[0].length];
            for (int i = 0; i < A.length; i++) {
                for (int j = 0; j < B[i].length; j++) {
                    int k = 0;
                    C[i][j] = 0;
                    while (k < A[i].length) {
                        C[i][j] += A[i][k] * B[k][j];
                        k++;
                    }
                }

            }
            return C;
        }
        return null;
    }

发表于 2021-02-01 21:13:10 回复(1)