Расчет производительности программы по перемножению квадратных матриц размерности N=30, 700, 2500

Рейтинг: 0Ответов: 2Опубликовано: 19.10.2014

Как посчитать сразу для трех N?

#include <stdio.h>
#include<math.h>
#include <stdlib.h>
#include <sys/time.h>
main()
{ int N=10;
 //int N[3];
 // N[1]=10;
 // N[2]=12;
 // N[3]=14;
struct timeval start_tv,end_tv;
int i,j,n,k;
double A[n][n],B[n][n],C[n][n];
double s;
 gettimeofday(&start_tv, NULL);
 // for( int z=1;z<3;z++)
 // {  n=N[z];
for( i=1;i<=n;i++)
 {
  for( j=1;j<=n;j++)
     {  A[i][j]=i;
         B[i][j]=1.0/j;
     }
 } 
 printf("Massiv В№1:\n");
for ( i=1;i<=n;i++)
{
    for ( j=1;j<=n;j++)
        printf("%.4f\t",A[i][j]);
        printf("\n");
}
printf("Massiv В№2:\n");

for ( i=1;i<=n;i++)
{
    for ( j=1;j<=n;j++)
        printf("%.4f\t",B[i][j]);
       printf("\n");
}
for (i=1; i<=n; i++)
for (j=1; j<=n; j++)
{   C[i][j]=0;
    for (k=1; k<=n; k++)
        {
          C[i][j]+=A[i][k]*B[k][j];
        }
}
printf("Massiv C:\n");

for ( i=1;i<=n;i++)
{
    for ( j=1;j<=n;j++)
       printf("%.3f\t",C[i][j]);
       printf("\n");
}  gettimeofday(&end_tv, NULL);
printf("The corner elements:\n");
printf("\n a[1][1] - %f\n",C[1][1]);
printf("\n a[1][n] - %f\n",C[1][n]);
printf("\n a[n][1] - %f\n",C[n][1]);
printf("\n a[n][n] - %f\n",C[n][n]);
s = (double)end_tv.tv_sec+(double)end_tv.tv_usec/1000000.0 - (double)start_tv.tv_sec -   (double)start_tv.tv_usec/1000000.0;
s = (2.0*(double)n*n*n)/s;
printf("\n Perform matrix multiplication - %f / per sec\n", s);
return 0;
}

Ответы

▲ 1

@ника:

Так. Всё очень плохо. Вам надо срочно прочитать любую книгу по основам C++, не менее двух раз.

int N[3];
N[1]=10;
N[2]=12;
N[3]=14;

В C++ массивы нумеруются от нуля, значит, при размере 3 доступные индексы — 0, 1 и 2. При попытке записи по индексы 3 элемент записывается «куда бог пошлёт»

int i,j,n,k;
double A[n][n],B[n][n],C[n][n];

Как это вообще компилируется? Чему равно n в этой точке? Ответ: непонятно чему. К тому же размеры массивов должны быть константами.

for( i=1;i<=n;i++)

Массивы нумеруются от 0 до длины минус 1. Срочно за книгу!

@ника: желание того, кто ставил задачу, не отменяет правил C/C++: массивы нумеруются от нуля, так что обращение к n-ому элементу незаконно. Вы можете наплевать на точное задание и положить B[i - 1][j - 1] = 1.0 / j; для i, j от 1 до n, если вам так удобнее. (То есть при обращении к массиву всё время корректировать индексы.)

▲ 1

Ну, написать (для gcc) такую программу умножения не проблема (она даже откомпилируется)

  int N[3] = {30, 700, 2500}, iN;

  for (iN = 0; iN < 3; iN++) {
    int i, j, k, n = N[iN];
    double A[n][n], B[n][n], C[n][n];

    ....

    for (i = 0; i < n; i++)
      for (j = 0; j < n; j++) {   
          C[i][j] = 0;
          for (k = 0; k < n; k++) 
            C[i][j] += A[i][k] * B[k][j];
      }
    ....        
  }

только для n == 2500 эти матрицы в стандартный размер стека не поместятся (его придется увеличить).