00001
00042
00043
00044
00045 #include <ReClaM/LinearEquation.h>
00046
00047
00048 LinearEquation::LinearEquation(const Array<double>& mat, const Array<double>& vec)
00049 : matrix(mat)
00050 , vector(vec)
00051 {
00052 if (mat.ndim() != 2
00053 || vec.ndim() != 1
00054 || mat.dim(0) != vec.dim(0)) throw SHARKEXCEPTION("[LinearEquationError::LinearEquationError] dimension conflict");
00055
00056 parameter.resize(mat.dim(1), false);
00057 parameter = 0.0;
00058 }
00059
00060 LinearEquation::~LinearEquation()
00061 {
00062 }
00063
00064
00065 void LinearEquation::model(const Array<double>& input, Array<double>& output)
00066 {
00067 throw SHARKEXCEPTION("[LinearEquation::model] this is not a data processing model");
00068 }
00069
00070 double LinearEquation::error()
00071 {
00072 int i, ic = matrix.dim(0);
00073 int p, pc = matrix.dim(1);
00074
00075 double ret = 0.0;
00076 for (i=0; i<ic; i++)
00077 {
00078 double sum = 0.0;
00079 for (p=0; p<pc; p++) sum += matrix(i, p) * getParameter(p);
00080 double diff = sum - vector(i);
00081 ret += diff * diff;
00082 }
00083 return ret;
00084 }
00085
00086 double LinearEquation::errorDerivative(Array<double>& derivative)
00087 {
00088 int i, ic = matrix.dim(0);
00089 int p, pc = matrix.dim(1);
00090 double ret = 0.0;
00091 derivative.resize(pc, false);
00092 Array<double> tmp(ic);
00093 for (i=0; i<ic; i++)
00094 {
00095 double sum = 0.0;
00096 for (p=0; p<pc; p++) sum += matrix(i, p) * getParameter(p);
00097 double diff = sum - vector(i);
00098 tmp(i) = 2.0 * diff;
00099 ret += diff * diff;
00100 }
00101 for (p=0; p<pc; p++)
00102 {
00103 double sum = 0.0;
00104 for (i=0; i<ic; i++) sum += matrix(i, p) * tmp(i);
00105 derivative(p) = sum;
00106 }
00107 return ret;
00108 }
00109
00110 double LinearEquation::error(Model& model, const Array<double>& input, const Array<double>& target)
00111 {
00112 return error();
00113 }
00114
00115 double LinearEquation::errorDerivative(Model& model, const Array<double>& input, const Array<double>& target, Array<double>& derivative)
00116 {
00117 return errorDerivative(derivative);
00118 }
00119
00120 void LinearEquation::getSolution(Array<double>& solution)
00121 {
00122 solution = parameter;
00123 }
00124