试题编号: | 202305-2 |
试题名称: | 矩阵运算 |
时间限制: | 5.0s |
内存限制: | 512.0MB |
问题描述: | 题目背景是 Transformer 中注意力模块的核心算式,其中 、 和 均是 行、列的矩阵, 表示矩阵 的转置, 表示矩阵乘法。 问题描述为了方便计算,顿顿同学将 简化为了点乘一个大小为 的一维向量 : 现给出矩阵 、 和 和向量 ,试计算顿顿按简化的算式计算的结果。 输入格式从标准输入读入数据。 输入的第一行包含空格分隔的两个正整数 和 ,表示矩阵的大小。 接下来依次输入矩阵 、 和 。每个矩阵输入 行,每行包含空格分隔的 个整数,其中第 行的第 个数对应矩阵的第 行、第 列。 最后一行输入 个整数,表示向量 。 输出格式输出到标准输出中。 输出共 行,每行包含空格分隔的 个整数,表示计算的结果。 样例输入 Data 样例输出 Data 子任务的测试数据满足: 且 ;输入矩阵、向量中的元素均为整数,且绝对值均不超过 。 全部的测试数据满足: 且 ;输入矩阵、向量中的元素均为整数,且绝对值均不超过 。 提示请谨慎评估矩阵乘法运算后的数值范围,并使用适当数据类型存储矩阵中的整数。 |
代码一:(强制类型转换)
#include "stdio.h"
long long a[30][30];
long long f[10010][30];
int main(){
int n,d;
int Q[10010][30],K[10010][30],V[10010][30];
int W[10010];
scanf("%d %d",&n,&d);
for (int i = 0; i < n; ++i) {
for (int j = 0; j < d; ++j) {
scanf("%d",&Q[i][j]);
}
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < d; ++j) {
scanf("%d",&K[i][j]);
}
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < d; ++j) {
scanf("%d",&V[i][j]);
}
}
for (int i = 0; i < n; ++i) {
scanf("%d",&W[i]);
}
for (int i = 0; i < d; ++i) {
for (int j = 0; j < d; ++j) {
for (int k = 0; k < n; ++k) {
a[i][j]+=(K[k][i]*V[k][j]);
}
}
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < d; ++j) {
for (int k = 0; k < d; ++k) {
f[i][j]+=(a[k][j]*Q[i][k]);
}
}
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < d; ++j) {
f[i][j]*=(long long)W[i];
}
}
for (int i = 0; i < n; ++i) {
printf("%lld",f[i][0]);
for (int j = 1; j < d; ++j) {
printf(" %lld",f[i][j]);
}
printf("\n");
}
return 0;
}
代码二:
#include "stdio.h"
long long a[30][30];
long long f[10010][30];
int main(){
int n,d;
int Q[10010][30],K[10010][30],V[10010][30];
long long W[10010];
scanf("%d %d",&n,&d);
for (int i = 0; i < n; ++i) {
for (int j = 0; j < d; ++j) {
scanf("%d",&Q[i][j]);
}
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < d; ++j) {
scanf("%d",&K[i][j]);
}
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < d; ++j) {
scanf("%d",&V[i][j]);
}
}
for (int i = 0; i < n; ++i) {
scanf("%lld",&W[i]);
}
for (int i = 0; i < d; ++i) {
for (int j = 0; j < d; ++j) {
for (int k = 0; k < n; ++k) {
a[i][j]+=(K[k][i]*V[k][j]);
}
}
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < d; ++j) {
for (int k = 0; k < d; ++k) {
f[i][j]+=(a[k][j]*Q[i][k]);
}
}
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < d; ++j) {
f[i][j]*=W[i];
}
}
for (int i = 0; i < n; ++i) {
printf("%lld",f[i][0]);
for (int j = 1; j < d; ++j) {
printf(" %lld",f[i][j]);
}
printf("\n");
}
return 0;
}
欢迎评论区留言