我要寫一個程式,大概是:讀取兩個txt里的資料,在呼叫資料進行一系列計算。我的這個讀取檔案的代碼一次只能讀取一個檔案,有沒有什么方法可以讀取兩個檔案并存到兩個vector里面(就是計算部分的originalCoor和targetCoor),然后再進行呼叫?明天要交作業,實在不知道該怎么寫了,求助各位大佬幫忙改一改!感激!
#include <iostream>
#include "Eigen/Dense"
#include <vector>
#include <map>
#include <fstream>
#include <sstream>
using namespace std;
using namespace Eigen;
//讀取檔案
bool readCECFCoor(vector<coorECEF_withname> &result)
{
string fileName;//檔案名
cout << "Please enter the path\n";
cin >> fileName;
ifstream file(fileName);
if (!file.is_open()){
cout << "Unable to read the file" << endl;
return false;
}
string line;
vector<string> strings;
double X = 0.0;
double Y = 0.0;
double Z = 0.0;
int counter = 0;
string name = "";
while (getline(file, line))
{
istringstream iss(line);
iss >> line;
string individualInfo = "";
for (int i = 0; i < line.length(); i++)
{
if (line[i] == ',')
{
if (counter == 0) name = individualInfo;
if (counter == 1) X = stod(individualInfo);
if (counter == 2) Y = stod(individualInfo);
cout << individualInfo << endl;
counter++;
individualInfo = "";
}
else
{
individualInfo = individualInfo + line[i];
}
}
Z = stod(individualInfo);
cout << individualInfo << endl;
coorECEF_withname tempCoor = { X, Y, Z, name };
result.push_back(tempCoor);
}
file.close();
return true;
}
//計算四引數
bool computePara_4(vector<coorECEF_withname>&originalCoor, vector<coorECEF_withname>&targetCoor, parameter_4 ¶)
{
vector<coorECEF_withname> result;
vector<string> name;
int originalCoor_n = originalCoor.size();
int targetCoor_n = targetCoor.size();
if (originalCoor_n != targetCoor_n)
{
cout << "源坐標系點數與目標坐標系點數不相等!\n" << endl;
return false;
}
if (originalCoor_n * 2 - 4 < 0)
{
cout << "條件方程個數不足!無法求解!\n";
return false;
}
int d = originalCoor_n;//點數量
int n = para.precision.n = originalCoor_n * 2;//條件方程數量
para.precision.r = para.precision.n - 4;//冗余度
MatrixXd B(n, 4);//系數矩陣
Matrix<double, Dynamic, 1> L;//常數向量
L.resize(n, 1);
MatrixXd x_s(d, 1), y_s(d, 1), x_t(d, 1), y_t(d, 1);
for (int i = 0; i < d; i++)
{
x_s(i, 0) = originalCoor[i].x;
y_s(i, 0) = originalCoor[i].y;
x_t(i, 0) = targetCoor[i].x;
y_t(i, 0) = targetCoor[i].y;
}
L << x_t - x_s,
y_t - y_s;
B << MatrixXd::Ones(d, 1), MatrixXd::Zero(d, 1), y_s, x_s,
MatrixXd::Zero(d, 1), MatrixXd::Ones(d, 1), -x_s, y_s;
Matrix<double, 4, 1> x;
x = (B.transpose() * B).inverse() * B.transpose() * L;//求解法方程
para.dx = x(0, 0);
para.dy = x(1, 0);
para.R = x(2, 0);
para.K = x(3, 0);
MatrixXd V(n, 1);
//計算改正數V
V = -(MatrixXd::Identity(n, n) - B * (B.transpose() * B).inverse() * B.transpose())*L;
for (int i = 0; i<d; i++)
{
coorECEF_withname temp_e = { V(i, 0), V(i + d, 0), 0, name[i] };
para.precision.e.push_back(temp_e);
}
//計算sigma0
para.precision.sigma0 = ((V.transpose() * V) / para.precision.r)(0, 0);
para.precision.sigma0 = sqrt(para.precision.sigma0);
return true;
}
int main()
{
vector<coorECEF_withname> result;
readCECFCoor(result);
vector<coorECEF_withname>originalCoor;
vector<coorECEF_withname>targetCoor;
parameter_4 para;
computePara_4(originalCoor, targetCoor, para);
string hold;
cin >> hold;
return 0;
}
uj5u.com熱心網友回復:
int main(){
vector<coorECEF_withname> result;
readCECFCoor(result);
readCECFCoor(result); //兩次呼叫函式,輸入不同的檔案名就好了呀
vector<coorECEF_withname>originalCoor;
uj5u.com熱心網友回復:
那我在后續程式要呼叫檔案中的資料的時候,兩個檔案是儲存在一個vector里面嘛?
uj5u.com熱心網友回復:
你自己看代碼,好好理解代碼。兩個檔案的記憶體都會保存在同一個result里(是否保存在同一個vector是看你的引數,兩次呼叫都傳同一個引數result就好了)。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/90268.html
標籤:C++ 語言
上一篇:c++程式 出現例外
下一篇:大神求解
