From f0dc8493371c18a2c016de25068f4b7f28638007 Mon Sep 17 00:00:00 2001 From: pv3e4i5aj Date: Sat, 23 Nov 2024 18:09:04 +0800 Subject: [PATCH] Add task3_pro.cpp --- task3_pro.cpp | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 task3_pro.cpp diff --git a/task3_pro.cpp b/task3_pro.cpp new file mode 100644 index 0000000..c78331e --- /dev/null +++ b/task3_pro.cpp @@ -0,0 +1,69 @@ +#include +#include +#include + +#define M 1000 +#define N 1021 +#define Q 1000 +//A(M*N),B(N*Q),C(M*Q)对于矩阵维度的说明 +void matmul(float** A, float** B, float** C) +{ + for (int i = 0; i < M; ++i) + { + for (int j = 0; j < Q; ++j) + { + C[i][j] = 0; + for (int k = 0; k < N; ++k) + { + C[i][j] += A[i][k] * B[k][j]; + } + } + } +} +int main() +{ + srand(time(NULL)); + + // 分配矩阵内存 + float** A = (float**)malloc(M * sizeof(float*)); + float** B = (float**)malloc(N * sizeof(float*)); + float** C = (float**)malloc(M * sizeof(float*)); + for (int i = 0; i < M; ++i) + { + A[i] = (float*)malloc(N * sizeof(float)); + C[i] = (float*)malloc(Q * sizeof(float)); + } + for (int i = 0; i < N; ++i) + { + B[i] = (float*)malloc(Q * sizeof(float)); + } + // 初始化矩阵数据 + for (int i = 0; i < M; i++) { + for (int j = 0; j < N; j++) { + A[i][j] = (float)(rand() % 100) / 100.0f; + } + } + for (int i = 0; i < N; i++) { + for (int j = 0; j < Q; j++) { + B[i][j] = (float)(rand() % 100) / 100.0f; + } + } + + clock_t start = clock(); + matmul(A, B, C); + clock_t end = clock(); + + // 计算并输出向量乘法的时间 + double multiply_time_spent = double(end - start) / CLOCKS_PER_SEC; + printf("使用基础的向量乘法:\n当矩阵A的维度为%d*%d,矩阵B的维度为%d*%d时,初始向量乘法时间:%lf秒\n",M,N,N,Q,multiply_time_spent); + + // 释放动态分配的内存 + for (int i = 0; i < M; ++i) { + free(A[i]);free(C[i]); + } + for (int i = 0; i < N ;++i) { + free(B[i]); + } + free(A); free(B); free(C); + +} \ No newline at end of file