CODE[VS] 1287 矩阵乘法

题目描述 Description

小明最近在为线性代数而头疼,线性代数确实很抽象(也很无聊),可惜他的老师正在讲这矩阵乘法这一段内容。
当然,小明上课打瞌睡也没问题,但线性代数的习题可是很可怕的。小明希望你来帮他完成这个任务。

现在给你一个ai行aj列的矩阵和一个bi行bj列的矩阵,要你求出他们相乘的积(当然也是矩阵)。
(输入数据保证aj=bi,不需要判断)

矩阵乘法的定义:

1. 矩阵A乘以B的时候,必须要求A的列数=B的行数,否则无法进行乘法运算。因此矩阵乘法也不满足交换律。

2. 设A是X*N的矩阵,B是N*Y的矩阵,用A的每一行乘以B的每一列,得到一个X*Y的矩阵。对于某一行乘以某一列的运算,我们称之为向量运算,即对应位置的每个数字相乘之后求和。

写为公式及:

C[i,j] = Sigma(A[i,k] * B[k,j])

输入描述 Input Description

输入文件共有ai+bi+2行,并且输入的所有数为整数(long long范围内)。
第1行:ai 和 aj
第2~ai+2行:矩阵a的所有元素
第ai+3行:bi 和 bj
第ai+3~ai+bi+3行:矩阵b的所有元素

输出描述 Output Description

输出矩阵a乘矩阵b的积(矩阵c)

样例输入 Sample Input

2 2
12 23
45 56
2 2
78 89
45 56

样例输出 Sample Output

1971 2356
6030 7141

数据范围及提示 Data Size & Hint

矩阵大小<=200*200

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

矩阵乘法~

过年更道水题~裸的矩阵乘法~


#include<cstdio>

int n1,m1,n2,m2,a[201][201],b[201][201],c[201][201];

int main()
{
	scanf("%d%d",&n1,&m1);
	for(int i=1;i<=n1;i++)
	  for(int j=1;j<=m1;j++) scanf("%d",&a[i][j]);
	scanf("%d%d",&n2,&m2);
	for(int i=1;i<=n2;i++)
	  for(int j=1;j<=m2;j++) scanf("%d",&b[i][j]);
	for(int i=1;i<=n1;i++)
	  for(int j=1;j<=m2;j++)
	    for(int k=1;k<=m1;k++) c[i][j]+=a[i][k]*b[k][j];
	for(int i=1;i<=n1;i++)
	{
		for(int j=1;j<=m2;j++) printf("%d ",c[i][j]);printf("\n");
	}
	return 0;
}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的汇编矩阵乘法程序,使用Masm32开发工具: ``` .386 .model flat, stdcall .stack 4096 ; 定义矩阵的大小 MATRIX_SIZE EQU 4 ; 定义矩阵A matrixA dd 1, 2, 3, 4 dd 5, 6, 7, 8 dd 9, 10, 11, 12 dd 13, 14, 15, 16 ; 定义矩阵B matrixB dd 1, 2, 3, 4 dd 5, 6, 7, 8 dd 9, 10, 11, 12 dd 13, 14, 15, 16 ; 定义矩阵C matrixC dd 0, 0, 0, 0 dd 0, 0, 0, 0 dd 0, 0, 0, 0 dd 0, 0, 0, 0 .code main proc mov eax, 0 mov ebx, 0 mov ecx, 0 mov edx, 0 ; A*B=C ; C(i,j) = sum(A(i,k)*B(k,j)) ; 计算C矩阵 outer_loop: mov ecx, 0 inner_loop: mov eax, matrixA[ebx] mov edx, matrixB[ecx*4] imul edx, eax add matrixC[edx*4], edx add ecx, 1 add ebx, 4 cmp ecx, MATRIX_SIZE jl inner_loop cmp ebx, MATRIX_SIZE*4 jl outer_loop ; 输出C矩阵 mov ebx, 0 mov ecx, 0 mov edx, 0 output_loop: mov eax, matrixC[ebx] ; 输出整数 call writeint ; 输出空格 call writechar add ecx, 1 add ebx, 4 cmp ecx, MATRIX_SIZE jl output_loop ; 退出程序 call crlf call waitmsg ret main endp ; 输出整数 writeint proc uses ebx ecx edx eax push eax push edx push ecx push ebx mov ebx, 10 xor edx, edx cmp eax, 0 jge positive neg eax mov ah, '-' call writechar positive: cmp eax, 0 jne loop_start mov dl, '0' call writechar jmp done loop_start: xor edx, edx div ebx add dl, '0' push edx cmp eax, 0 jne loop_start loop_end: pop edx call writechar cmp esp, DWORD PTR [esp+4] ja loop_end done: pop ebx pop ecx pop edx pop eax ret writeint endp ; 输出字符 writechar proc uses eax push eax mov eax, [esp+4] mov edx, 1 push esi push edi lea esi, eax mov edi, OFFSET buffer rep movsb pop edi pop esi mov edx, 1 mov ecx, OFFSET buffer mov ebx, 1 mov eax, 4 int 0x80 add esp, 4 ret writechar endp ; 输出换行符 crlf proc mov edx, OFFSET crlf_buffer mov ecx, 2 mov ebx, 1 mov eax, 4 int 0x80 ret crlf endp ; 等待用户输入 waitmsg proc mov edx, OFFSET msg_buffer mov ecx, 12 mov ebx, 1 mov eax, 4 int 0x80 ret waitmsg endp ; 定义缓冲区 buffer db 32 dup(0) msg_buffer db 'Press any key.', 0x0a, 0x0d, 0 crlf_buffer db 0x0a, 0x0d, 0 end main ``` 这个程序计算两个4x4的矩阵的乘积,并将结果存储在另一个4x4的矩阵中。最后,程序将结果矩阵输出到屏幕上。其中,writeint、writechar、crlf和waitmsg是一些辅助过程,用于输出整数、字符、换行符和等待用户输入。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值