202305-2-矩阵运算

一、题目分析

此题本质是计算 ( W ⋅ ( Q × K T ) ) × V (W·(Q×K^T))×V (W(Q×KT))×V的值。
注意任务要求:

70% 的测试数据满足:n<=100且d<=10 。输入矩阵、向量中的元素均为整数,且绝对值均不超过30 。
全部的测试数据满足:n<=10^4 且d<=20 。输入矩阵、向量中的元素均为整数,且绝对值均不超过 1000;

因此如果按照顺序计算,那么运算量超过10^9(约为1s),则会超时,因此可以在计算中合并一些运算。

二、代码展示(c)

#include <malloc.h>
int main() {
    int n,d;

    int i,j;
    scanf("%d%d",&n,&d);
    //printf("%d %d\n",n,d);
    //-------------------初始化-----------------------
    int** Q = (int**)malloc(sizeof(int*) * n);
    int** K = (int**)malloc(sizeof(int*) * n);
    int** V = (int**)malloc(sizeof(int*) * n);
    int* W = (int*)malloc(sizeof(int*) * n);
    //-------------------初始化-----------------------
    for(i = 0;i < n;i++){
        *(Q+i) = (int*)malloc(sizeof(int) * d);
        for(j = 0;j < d;j++){
            scanf("%d",&Q[i][j]);
        }
    }
    for(i = 0;i < n;i++){
        *(K+i) = (int*)malloc(sizeof(int) * d);
        for(j = 0;j < d;j++){
            scanf("%d",&K[i][j]);
        }
    }
    for(i = 0;i < n;i++){
        *(V+i) = (int*)malloc(sizeof(int) * d);
        for(j = 0;j < d;j++){
            scanf("%d",&V[i][j]);
        }
    }
    long long** res = (long long**)malloc(sizeof(long long*) * n);
    //long long** result = (long long**)malloc(sizeof(long long*) * n);
    for(i = 0;i < n;i++) {
        *(res+i) = (long long*)malloc(sizeof(long long) * n);
        //*(result+i) = (long long*)malloc(sizeof(long long) * d);
        scanf("%d",&W[i]);
    }


    for (i = 0;i < n;i++){
        for(j = 0;j < n;j++){
            res[i][j] = 0;
            int k,p;
            for(k = 0;k < d;k++) {
                //printf("%d %d\n",Q[i][k],K[j][k]);
                res[i][j] += (long long)Q[i][k]*(long long)K[j][k];
            }
        }
        for(j = 0;j < d;j++){
            long long result = 0;
            int k,p;
            for(k = 0;k < n;k++) {
                result += (long long)res[i][k]*(long long)V[k][j]*(long long)W[i];
            }
            printf("%lld ",result);
        }
        printf("\n");
    }
    return 0;
}

三、注意事项

此题因为存入的数很多,因此需要动态开辟二维数组。设一个二维数组为Q,方式如下:

int** Q = (int**)malloc(sizeof(int*) * n);
for(i = 0;i < n;i++){
        *(Q+i) = (int*)malloc(sizeof(int) * d);
        for(j = 0;j < d;j++){
            scanf("%d",&Q[i][j]);
        }
    }

边创建数组边读入会更省时间~

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值