00001 00002 #include <vecmath/GVector.h> 00003 #include <vecmath/GMatrix.h> 00004 00005 void GVector::LUDBackSolve(GMatrix& gmatrix, GVector& gvector, GVector& gvector1) { 00006 int i = gmatrix.nRow * gmatrix.nCol; 00007 double *ad = new double[i]; 00008 double *ad1 = new double[i]; 00009 int *ai = new int[gvector.getSize()]; 00010 00011 for (int j = 0; j < gmatrix.nRow; j++) { 00012 for (int k1 = 0; k1 < gmatrix.nCol; k1++) 00013 ad[j * gmatrix.nCol + k1] = gmatrix.values[j][k1]; 00014 } 00015 00016 for (int k = 0; k < i; k++) 00017 ad1[k] = 0.0; 00018 00019 for (int l = 0; l < gmatrix.nRow; l++) 00020 ad1[l * gmatrix.nCol] = gvector.values[l]; 00021 00022 for (int i1 = 0; i1 < gmatrix.nCol; i1++) 00023 ai[i1] = (int)gvector1.values[i1]; 00024 00025 GMatrix::luBacksubstitution(gmatrix.nRow, ad, ai, ad1); 00026 for (int j1 = 0; j1 < gmatrix.nRow; j1++) 00027 values[j1] = ad1[j1 * gmatrix.nCol]; 00028 00029 delete []ad; 00030 delete []ad1; 00031 delete []ai; 00032 } 00033 00034 void GVector::SVDBackSolve(GMatrix& gmatrix, GMatrix& gmatrix1, GMatrix& gmatrix2, GVector& gvector) { 00035 GMatrix gmatrix3(gmatrix.nRow, gmatrix1.nCol); 00036 gmatrix3.mul(gmatrix, gmatrix2); 00037 gmatrix3.mulTransposeRight(gmatrix, gmatrix1); 00038 gmatrix3.invert(); 00039 mul(gmatrix3, gvector); 00040 } 00041 00042 void GVector::mul(const GMatrix& gmatrix, const GVector& gvector) { 00043 for (int j = 0; j < length; j++) { 00044 values[j] = 0.0; 00045 for (int i = 0; i < gvector.length; i++) 00046 values[j] += gmatrix.values[j][i] * gvector.values[i]; 00047 } 00048 } 00049 00050 void GVector::mul(const GVector& gvector, const GMatrix& gmatrix) { 00051 for (int j = 0; j < length; j++) { 00052 values[j] = 0.0; 00053 for (int i = 0; i < gvector.length; i++) 00054 values[j] += gmatrix.values[i][j] * gvector.values[i]; 00055 } 00056 } 00057