www.pudn.com > roadextr.rar > Matrix.cpp
#include "stdafx.h" #include "valdef.h" #include#include #include "Matrix.h" void MatrixMultiply(double *mA, double *mB, int rowa, int cola, int colb, double *mC) { int i, j, k; for (i=0 ; i 2) { /*if the matrix is 3 x 3 or bigger */ for (i=0;i t2) // if (fabs(a[i-1][j-1])>fabs(w)) { w = *(a + (i-1)*n + j-1);// w = a[i-1][j-1]; i0 = i; j0 = j; } } t2 = w; if (w<0) t2 = -w; if (false) /// t2<=EP // if (fabs(w)<=EP) { delete []p; delete []q; delete []b; delete []c; return false; } if (i0!=k) for (j=1;j<=n;j++) { z = *(a + (i0-1)*n + j-1);/// z = a[i0-1][j-1]; *(a + (i0-1)*n + j-1) = *(a + (k-1)*n + j-1); /// a[i0-1][j-1] = a[k-1][j-1]; *(a + (k-1)*n + j-1) = z;/// a[k-1][j-1] = z; } if (j0!=k) for (i=1;i<=n;i++) { z = *(a + (i-1)*n + j0-1);/// z = a[i-1][j0-1]; *(a + (i-1)*n + j0-1) = *(a + (i-1)*n + k-1); /// a[i-1][j0-1] = a[i-1][k-1]; *(a + (i-1)*n + k-1) = z;//a[i-1][k-1] = z; } p[k-1] = i0; q[k-1] = j0; for (j=1;j<=n;j++) { if (j==k) { b[j-1] = 1/w; c[j-1] = 1; } else { b[j-1] = -*(a + (k-1)*n + j-1)/w;//// -a[k-1][j-1]/w; c[j-1] = *(a + (j-1)*n + k-1);//// a[j-1][k-1]; } *(a + (k-1)*n + j-1) = *(a + (j-1)*n + k-1) = 0.0;/// a[k-1][j-1] = a[j-1][k-1] = 0.0; } for (i=1;i<=n;i++) for (j=1;j<=n;j++) /// a[i-1][j-1] = a[i-1][j-1] + c[i-1]*b[j-1]; *(a + (i-1)*n + j-1) = *(a + (i-1)*n + j-1) + c[i-1]*b[j-1]; } for (k=n;k>=1;k--) { i0 = p[k-1]; j0 = q[k-1]; if (i0!=k) for (i=1;i<=n;i++) { z = *(a + (i-1)*n + i0-1);/// a[i-1][i0-1]; *(a + (i-1)*n + i0-1) = *(a + (i-1)*n + k-1);//a[i-1][i0-1] = a[i-1][k-1]; *(a + (i-1)*n + k-1) = z;/// a[i-1][k-1] = z; } if (j0!=k) for (j=1;j<=n;j++) { z = *(a + (j0-1)*n + j-1);/// a[j0-1][j-1]; *(a + (j0-1)*n + j-1) = *(a + (k-1)*n + j-1);/// a[j0-1][j-1] = a[k-1][j-1]; *(a + (k-1)*n + j-1) = z; // a[k-1][j-1] = z; } } delete[]p; delete[]q; delete[]b; delete[]c; return true; }