//Autor: Artur Czekalski (Sator)  www.epokaY.net/artur  artur@epokaY.net
//Mnożenie macierzy o wyrazach typu float
#include "stdafx.h"
#include <windows.h> //GetTickCount()
//---------------------------------------------------------------------------
const int M = 1000; //liczba wierszy w A
const int N = 700; //liczba kolumn w A i wierszy w B
const int K = 500; //liczba kolumn w B
float A[M*N]; //A[i][j]=A[i*N+j]
float B[N*K];
float C[M*K];
//---------------------------------------------------------------------------
inline void MnozMacierze(int M, int N, int K,  float *A, float *B, float *C)
{//A[M][N]; B[N][K]; C[M][K];  A[i][j] = A[i*(l.kolumn)+j]; i-wiersz; j-kolumna
 //C[i][j] = Suma po 0<x<N : A[i][x]*B[x][j]
 int i, j, x, w, z;  float S;
 for (i=0; i<M; ++i)
  {z = i*K;
   for (j=0; j<K; ++j)
    {S = 0.0f;  w = i*N;  
     for (x=0; x<N; ++x)
      S += A[w+x] * B[x*K+j];
     C[z+j] = S;
    }
   }
}
//---------------------------------------------------------------------------
int main(int, char* [])
{
 int i, j;  float w = 0.0f;
 //---A[]=
 for (i=0; i<M; ++i) //wiersze
  {for (j=0; j<N; ++j) //kolukmy
    A[i*N+j] = w;  w += 0.01f;
  }
 //---B[]=
 for (i=0; i<N; ++i) //wiersze
  {for (j=0; j<K; ++j) //kolukmy
    B[i*K+j] = w;  w -= 0.01f;
  }
 //---
 int czas;
 czas = GetTickCount();
 MnozMacierze(M, N, K, A, B, C);
 czas = GetTickCount() - czas;
 
 //---Spr. C[]
 w = 0.0f;
 for (i=0; i<M*K; ++i)
  w += C[i];
 printf("Suma wyrazow C[]=%.10f\n", w);
 //---
 printf("\nVisual C++ 6.0. Czas=%d", czas);
 getchar();  return 0;
}