大家好,你们这里很容易提问,
我在这里有一些代码来计算最佳拟合线方程。我遇到了嵌套在for循环中的while循环问题。目前,"而(点>>>> Yi)"只运行一次,然后(我猜)当它到达文档的末尾时,它不会重复自己。怎么能让它重复1000次?不能使用数组,我们还没有在课堂上教过这些数据;(。
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
double measureSSE(double m, double b, double Xi, double Yi)
{
return (Yi - ((m * Xi) + b)) * (Yi - ((m * Xi) + b));
}
int main()
{
double Xi = 0, Yi = 0;
double m = 0, b = 0;
double dm = 0, db = 0;
double SSE = 0;
ifstream points("points.txt");
if(points.is_open())
{
for(int counter = 0; counter < 1000; counter++)
{
while(points >> Xi >> Yi)
{
dm += -2 * Xi * (Yi - (m * Xi) - b);
db += -2 * (Yi - (m * Xi) - b);
m -= .01 * dm;
b -= .01 * db;
SSE += measureSSE(m, b, Xi, Yi);
}
cout << "SSE: " << SSE << endl;
}
cout << "Final Model: y = " << m << "x + " << b << endl;
points.close();
}
else cout << "Unable to open file." << endl;
}
答案 0 :(得分:2)
假设您希望每次都从头开始重新启动迭代文件,您需要在while
循环之前seek the read cursor,以便即使之前的运行达到EOF也能正常工作。您还需要首先清除EOF标志(除非您正在编写C ++ 11或更高版本,其中已为您完成此操作)。
当您重新输入从流中提取时预测的while
循环时,该语言没有任何特殊规则可以为您执行此操作。
for(int counter = 0; counter < 1000; counter++)
{
// Clear EOF flag, and revert to the beginning of the stream
points.clear();
points.seekg(0);
// Extract all "points" from the file
while(points >> Xi >> Yi)
我不太清楚SSE
应该在这里做什么,因为除了调试输出之外你从未真正使用它的值。如果我知道它做了什么,我可能会建议在0
循环的每次迭代时将其值重置为for
。 :)