三重循环矩阵乘法运行时间比较

来源:互联网 发布:煎饼侠 知乎 编辑:程序博客网 时间:2024/06/05 20:52
#include <iostream>#include <ctime>#include <cstdlib>using namespace std;void Time(int n);void fun1(int **A, int **B, int **C, int n);void fun2(int **A, int **B, int **C, int n);void fun3(int **A, int **B, int **C, int n);void fun4(int **A, int **B, int **C, int n);void fun5(int **A, int **B, int **C, int n);void fun6(int **A, int **B, int **C, int n);int main(int argc, char const *argv[]){int n;for (n = 50; n <= 1000; n += 50){Time(n);cout << endl;}return 0;}void Time(int n){int i, j, k, r;int sum;clock_t start, finish;int **A, **B, **C;A = new int *[n];B = new int *[n];C = new int *[n];for (i = 0; i != n; ++i){A[i] = new int [n];B[i] = new int [n];C[i] = new int [n];}for (i = 0; i != n; ++i)for (j = 0; j != n; ++j){A[i][j] = rand();B[i][j] = rand();C[i][j] = 0;}start = clock();fun1(A, B, C, n);finish = clock();cout << (double)(finish-start)/CLOCKS_PER_SEC << "\t";start = clock();fun2(A, B, C, n);finish = clock();cout << (double)(finish-start)/CLOCKS_PER_SEC << "\t";start = clock();fun3(A, B, C, n);finish = clock();cout << (double)(finish-start)/CLOCKS_PER_SEC << "\t";start = clock();fun4(A, B, C, n);finish = clock();cout << (double)(finish-start)/CLOCKS_PER_SEC << "\t";start = clock();fun5(A, B, C, n);finish = clock();cout << (double)(finish-start)/CLOCKS_PER_SEC << "\t";start = clock();fun6(A, B, C, n);finish = clock();cout << (double)(finish-start)/CLOCKS_PER_SEC << "\t";delete [] A;delete [] B;delete [] C;}void fun1(int **A, int **B, int **C, int n){int i, j, k, sum;for (i = 0; i != n; ++i)for (j = 0; j != n; ++j) {sum = 0;for (k = 0; k != n; ++k)sum += A[i][k] * B[k][j];C[i][j] += sum;}}void fun2(int **A, int **B, int **C, int n){int i, j, k, sum;for (j = 0; j != n; ++j)for (i = 0; i != n; ++i) {sum = 0;for (k = 0; k != n; ++k)sum += A[i][k] * B[k][j];C[i][j] += sum;}}void fun3(int **A, int **B, int **C, int n){int i, j, k, r;for (j = 0; j != n; ++j)for (k = 0; k != n; ++k) {r = B[k][j];for (i = 0; i != n; ++i)C[i][j] += A[i][k] * r;}}void fun4(int **A, int **B, int **C, int n){int i, j, k, r;for (k = 0; k != n; ++k)for (j = 0; j != n; ++j) {r = B[k][j];for (i = 0; i != n; ++i)C[i][j] += A[i][k] * r;}}void fun5(int **A, int **B, int **C, int n){int i, j, k, r;for (k = 0; k != n; ++k)for (i = 0; i != n; ++i) {r = B[i][k];for (j = 0; j != n; ++j)C[i][j] += B[k][j] * r;}}void fun6(int **A, int **B, int **C, int n){int i, j, k, r;for (i = 0; i != n; ++i)for (k = 0; k != n; ++k) {r = B[i][k];for (j = 0; j != n; ++j)C[i][j] += B[k][j] * r;}}

0 0