65,187
社区成员




#pragma warning (disable:4786)
//#include "RegressionLine.hpp"
#include <map>
#include <string>
#include <iostream>
#include <math.h>
using namespace std;
class RegressionLine
{
public:
typedef map<double,double> Points;
RegressionLine(Points & points);
virtual ~RegressionLine();
const double slope() const;
const double yIntercept() const;
const double regressionCoefficient() const;
private:
double slope_;
double yIntercept_;
double regressionCoefficient_;
};
// 上面是定义一个类,如果把它作为一个头文件,放在.hpp文件中的话,编译就会出现很多错误。而把typedef拿出来后,把这段代码贴到.cpp文件
// 的前面的话,程序就能运行了,请问这是为什么啊?
RegressionLine::RegressionLine(Points & points)
{
int n = points.size();
if (n < 2)
throw (string("Must have at least two points"));
double sumx=0,sumy=0,sumx2=0,sumy2=0,sumxy=0;
double sxx,syy,sxy;
// Conpute some things we need
map<double, double>::const_iterator i;
for (i = points.begin(); i != points.end(); i++)
{
double x = i->first;
double y = i->second;
sumx += x;
sumy += y;
sumx2 += (x * x);
sumy2 += (y * y);
sumxy += (x * y);
}
sxx = sumx2 - (sumx * sumx / n);
syy = sumy2 - (sumy * sumy / n);
sxy = sumxy - (sumx * sumy / n);
// Infinite slope_, non existant yIntercept
if (abs(sxx) == 0)
throw (string("Inifinite Slope"));
// Calculate the slope_ and yIntercept
slope_ = sxy / sxx;
yIntercept_ = sumy / n - slope_ * sumx / n;
// Compute the regression coefficient
if (abs(syy) == 0)
regressionCoefficient_ = 1;
else
regressionCoefficient_ = sxy / sqrt(sxx * syy);
}
RegressionLine::~RegressionLine()
{
}
const double RegressionLine::slope() const
{
return slope_;
}
const double RegressionLine::yIntercept() const
{
return yIntercept_;
}
const double RegressionLine::regressionCoefficient() const
{
return regressionCoefficient_;
}
int main()
{
const int count = 10;
double times[count] = {
-0.20707, 0.706672, 1.63739, 2.03117, 3.31874,
5.38201, 6.79971, 6.31814, 8.20829, 8.53994 };
double water[count] = {
-0.319029, 0.0931669, 2.17286, 2.76818, 3.56743,
4.11772, 5.52709, 7.46613, 8.7654, 9.58096 };
Points pnts;
for (int i = 0; i < count; i++)
{
pnts[times[i]] = water[i];
}
RegressionLine myLine(pnts);
cout << "Slope = " << myLine.slope() << endl;
cout << "yIntercept = " << myLine.yIntercept() << endl;
cout << "Regression Coefficient = "<< myLine.regressionCoefficient() << endl;
return 0;
}
d:\ctest\linear_regression\regressionline.hpp(12) : error C2143: syntax error : missing ';' before '<'
d:\ctest\linear_regression\regressionline.hpp(12) : error C2059: syntax error : '<'
d:\ctest\linear_regression\regressionline.hpp(12) : error C2238: unexpected token(s) preceding ';'
d:\ctest\linear_regression\regressionline.hpp(13) : error C2629: unexpected 'class RegressionLine ('
d:\ctest\linear_regression\regressionline.hpp(13) : error C2238: unexpected token(s) preceding ';'
d:\ctest\linear_regression\regressionline.cpp(33) : error C2065: 'Points' : undeclared identifier
d:\ctest\linear_regression\regressionline.cpp(33) : error C2065: 'points' : undeclared identifier
d:\ctest\linear_regression\regressionline.cpp(34) : error C2448: '<Unknown>' : function-style initializer appears to be a function definition
d:\ctest\linear_regression\regressionline.cpp(105) : error C2039: 'Points' : is not a member of 'RegressionLine'
d:\ctest\linear_regression\regressionline.hpp(10) : see declaration of 'RegressionLine'
d:\ctest\linear_regression\regressionline.cpp(105) : error C2146: syntax error : missing ';' before identifier 'pnts'
d:\ctest\linear_regression\regressionline.cpp(105) : error C2065: 'pnts' : undeclared identifier
d:\ctest\linear_regression\regressionline.cpp(109) : error C2109: subscript requires array or pointer type
d:\ctest\linear_regression\regressionline.cpp(109) : error C2106: '=' : left operand must be l-value
Error executing cl.exe.
#pragma warning (disable:4786)
//#include "RegressionLine.hpp"
#include <map>
#include <string>
#include <iostream>
#include <math.h>
using namespace std;
class RegressionLine
{
public:
typedef map<double,double> Points;
RegressionLine(Points & points);
virtual ~RegressionLine();
const double slope() const;
const double yIntercept() const;
const double regressionCoefficient() const;
private:
double slope_;
double yIntercept_;
double regressionCoefficient_;
};
// 上面是定义一个类,如果把它作为一个头文件,放在.hpp文件中的话,编译就会出现很多错误。而把typedef拿出来后,把这段代码贴到.cpp文件
// 的前面的话,程序就能运行了,请问这是为什么啊?
RegressionLine::RegressionLine(Points & points)
{
int n = points.size();
if (n < 2)
throw (string("Must have at least two points"));
double sumx=0,sumy=0,sumx2=0,sumy2=0,sumxy=0;
double sxx,syy,sxy;
// Conpute some things we need
map<double, double>::const_iterator i;
for (i = points.begin(); i != points.end(); i++)
{
double x = i->first;
double y = i->second;
sumx += x;
sumy += y;
sumx2 += (x * x);
sumy2 += (y * y);
sumxy += (x * y);
}
sxx = sumx2 - (sumx * sumx / n);
syy = sumy2 - (sumy * sumy / n);
sxy = sumxy - (sumx * sumy / n);
// Infinite slope_, non existant yIntercept
if (abs(sxx) == 0)
throw (string("Inifinite Slope"));
// Calculate the slope_ and yIntercept
slope_ = sxy / sxx;
yIntercept_ = sumy / n - slope_ * sumx / n;
// Compute the regression coefficient
if (abs(syy) == 0)
regressionCoefficient_ = 1;
else
regressionCoefficient_ = sxy / sqrt(sxx * syy);
}
RegressionLine::~RegressionLine()
{
}
const double RegressionLine::slope() const
{
return slope_;
}
const double RegressionLine::yIntercept() const
{
return yIntercept_;
}
const double RegressionLine::regressionCoefficient() const
{
return regressionCoefficient_;
}
int main()
{
const int count = 10;
double times[count] = {
-0.20707, 0.706672, 1.63739, 2.03117, 3.31874,
5.38201, 6.79971, 6.31814, 8.20829, 8.53994 };
double water[count] = {
-0.319029, 0.0931669, 2.17286, 2.76818, 3.56743,
4.11772, 5.52709, 7.46613, 8.7654, 9.58096 };
RegressionLine::Points pnts;
for (int i = 0; i < count; i++)
{
pnts[times[i]] = water[i];
}
RegressionLine myLine(pnts);
cout << "Slope = " << myLine.slope() << endl;
cout << "yIntercept = " << myLine.yIntercept() << endl;
cout << "Regression Coefficient = "<< myLine.regressionCoefficient() << endl;
return 0;
}
以上代码在vc6.0和mingw下都能通过:
运行结果:
vc6.0:
Slope = 1.04116
yIntercept = -0.0754263
Regression Coefficient = 0.966565
Press any key to continue
mingw下:
Slope = 1.04116
yIntercept = -0.0754263
Regression Coefficient = 0.966565
Terminated with return code 0
Press any key to continue ...
你的typedef map<double,double> Points;是在类RegressionLine作用域内,
在外面使用就得RegressionLine::Points,或者把它拿出来
int main()
{...
RegressionLine::Points pnts;
...
}