00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "MathStuff.h"
00022 #include <math.h>
00023
00024 using namespace lfeat;
00025
00026 bool Math::SolveLinearSystem33(double* solution, double sq[3][3])
00027 {
00028 const int size = 3;
00029 int row, col, c, pivot = 0, i;
00030 double maxc, coef, temp, mult, val;
00031
00032
00033 for (col = 0; col < size - 1; col++)
00034 {
00035
00036 maxc = -1.0;
00037 for (row = col; row < size; row++)
00038 {
00039 coef = sq[row][col];
00040 coef = (coef < 0.0 ? - coef : coef);
00041 if (coef > maxc)
00042 {
00043 maxc = coef;
00044 pivot = row;
00045 }
00046 }
00047 if (pivot != col)
00048 {
00049
00050
00051 for (i = 0; i < size; i++)
00052 {
00053 temp = sq[pivot][i];
00054 sq[pivot][i] = sq[col][i];
00055 sq[col][i] = temp;
00056 }
00057 temp = solution[pivot];
00058 solution[pivot] = solution[col];
00059 solution[col] = temp;
00060 }
00061
00062 for (row = col + 1; row < size; row++)
00063 {
00064 mult = sq[row][col] / sq[col][col];
00065 for (c = col; c < size; c++)
00066 {
00067 sq[row][c] -= mult * sq[col][c];
00068 }
00069 solution[row] -= mult * solution[col];
00070 }
00071 }
00072
00073
00074 for (row = size - 1; row >= 0; row--)
00075 {
00076 val = solution[row];
00077 for (col = size - 1; col > row; col--)
00078 {
00079 val -= solution[col] * sq[row][col];
00080 }
00081 solution[row] = val / sq[row][row];
00082 }
00083 return true;
00084 }
00085
00086 bool Math::Normalize(double* iVec, int iLen)
00087 {
00088
00089 int i;
00090 double val, fac, sqlen = 0.0;
00091
00092 for (i = 0; i < iLen; i++)
00093 {
00094 val = iVec[i];
00095 sqlen += val * val;
00096 }
00097 if (sqlen == 0.0)
00098 {
00099 return false;
00100 }
00101
00102 fac = 1.0 / sqrt(sqlen);
00103 for (i = 0; i < iLen; i++)
00104 {
00105 iVec[i] *= fac;
00106 }
00107
00108 return true;
00109 }
00110