Код:
void zap(double *a, int n)//-Заполняем массив
{
srand(time(NULL));
for (int i=0; i < n; i++)
for (int j=0; j < n; j++)
a[i*n+j]=rand() % 100;
listBox1->Items->Add("ok");
}
void met1(double *a, double *b, double *c, int n)//-первый метод
{
int i, j, m;
double *pa, *pb, *pc, s;
for (m=0, pc=c; m<n; m++)
for (i = 0, pb=b; i < n; i++, pb++)
{
for (s=0, j=0, pa=a+m*n; j<n; j++)
s+=*(pa++)*pb[j*n];
*(pc++)=s;
}
listBox1->Items->Add("ok");
}
void met2(double *a, double *b, double *c, int n)//-второй метод
{
int i, j, m;
double *pa, *pb, *pc, s;
for (m=0, pc=c; m<n; m++, pc++)
for (i = 0, pa=a, pb=b+m; i < n; i++)
{
for (s=0, j=0; j<n; j++)
s+=*(pa++)*pb[j*n];
pc[i*n]=s;
}
listBox1->Items->Add("ok");
}
void met3(double *a, double *b, double *c, int n)//-третий метод
{
int i, j, m, bm, bi, nbm, nbi, N=10;
double *pa, *pb, *pc, s;
for (bm=0; bm<n; bm += N)
{
nbm=(bm+N<=n ? bm+N:n);
for (bi = 0; bi<n; bi+=N)
{
nbi=(bi+N<=n ? bi+N:n);
for (m=bm, pc=c+bm; m<nbm; m++, pc++)
for (i=bi, pa=a+bi*n, pb=b+m; i<nbi; i++)
{
for (s=0, j=0; j<n; j++)
s+=*(pa++)*pb[j*n];
pc[i*n]=s;
}
}
}
listBox1->Items->Add("ok");
}
void met4(double *a, double *b, double *c, int n)//-четвертый метод
{
int i, j, m, nl, bm, bi, nbm, nbi, N=10, l;
double *pa, *pb, *pc, s;
for (bm=0; bm<n; bm+=N)
{
nbm=(bm+N<=n ? bm+N:n);
for (bi = 0; bi<n; bi+=N)
{
nbi=(bi+N<=n ? bi+N:n);
for (m=bm, pc=c+bm; m<nbm; m++, pc++)
for (i=bi; i<nbi; i++)
pc[i*m]=0;
for(l=0; l<n; l+=N)
{
nl=(l+N<=n ? l+N:n);
for (m=bm, pc=c+bm; m<nbm; m++, pc++)
for (i=bi, pb=b+m; i<nbi; i++)
{
pa=a+l+i*n;
for (s=0, j=l; j<nl; j++)
s+=*(pa++)*pb[j*n];
pc[i*n]+=s;
}
}
}
}
listBox1->Items->Add("ok");
}
void met5(double *a, double *b, double *c, int n)//-пятый метод
{
int i, j, m, nl, bm, bi, nbm, nbi, N=10, l;
double *pa, *pb, *pc, s00, s01, s10, s11;
for (bm=0; bm<n; bm+=N)
{
nbm=(bm+N<=n ? bm+N:n);
for (bi = 0; bi<n; bi+=N)
{
nbi=(bi+N<=n ? bi+N:n);
for (m=bm, pc=c+bm; m<nbm; m++, pc++)
for (i=bi; i<nbi; i++)
pc[i*m]=0;
for(l=0; l<n; l+=N)
{
nl=(l+N<=n ? l+N:n);
for (m=bm, pc=c+bm; m<nbm; m+=2, pc+=2)
for (i=bi, pb=b+m; i<nbi; i+=2)
{
pa=a+l+i*n;
s00=s01=s10=s11=0;
for (j=l; j<nl; j++, pa++)
{
s00+=pa[0]*pb[j*n];
s01+=pa[0]*pb[j*n+1];
s10+=pa[n]*pb[j*n];
s11+=pa[0]*pb[j*n+1];
}
pc[i*n]+=s00;
pc[i*n+1]+=s01;
pc[(i+1)*n]+=s10;
pc[(i+1)*n+1]+=s11;
}
}
}
}
listBox1->Items->Add("ok");
}
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{ listBox1->Items->Clear();
// timer1->Enabled=true;
listBox1->Items->Add("Начало перемножения матриц 1000х1000");
listBox1->Items->Add("Забиваем матрицы числами");
double *pa = new double[1000000];
double *pb = new double[1000000];
//-Заполнение массивов
zap(pa,1000);
zap(pb,1000);
double *pc = new double[1000000];
listBox1->Items->Add("Матрицы забиты числами, это заняло "+t/100+"сек");
// t=0;
listBox1->Items->Add(" ");
listBox1->Items->Add("Собственно перемножаем первым способом");
met1(pa,pb,pc,1000);
listBox1->Items->Add("Перемножение первым способом заняло "+t/100+"сек");
// t=0;
listBox1->Items->Add(" ");
listBox1->Items->Add("Перемножаем вторым способом");
met2(pa,pb,pc,1000);
listBox1->Items->Add("Перемножение вторым способом заняло "+t/100+"сек");
// t=0;
listBox1->Items->Add(" ");
listBox1->Items->Add("Перемножаем третьим способом");
met3(pa,pb,pc,1000);
listBox1->Items->Add("Перемножение третьим способом заняло "+t/100+"сек");
// t=0;
listBox1->Items->Add(" ");
listBox1->Items->Add("Перемножаем четвертым способом");
met4(pa,pb,pc,1000);
listBox1->Items->Add("Перемножение четвертым способом заняло "+t/100+"сек");
// t=0;
listBox1->Items->Add(" ");
listBox1->Items->Add("Перемножаем пятым способом");
met5(pa,pb,pc,1000);
listBox1->Items->Add("Перемножение пятым способом заняло "+t/100+"сек");
// t=0;
listBox1->Items->Add(" ");
listBox1->Items->Add("ура, конец");
//-Чистим
delete[] pa;
delete[] pb;
delete[] pc;
}
private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e)
{
// t++;
}
private: System::Void timer2_Tick(System::Object^ sender, System::EventArgs^ e)
{
// t1++;
}
};
}