C++ c++;从给定的.dat文件将字符串向量转换为双精度向量
所以我有很多问题,但我将从我认为应该是简单的问题开始。我被指派比较模板文件和查询文件,计算点积,并返回10个最近邻。我想我可以相当容易地进行计算,但是我在处理文件I/o时遇到了困难。我能够将数据读入字符串向量,但我不确定如何将其转换为双精度向量,同时保持顶点的完整性。如果我尝试使用字符串流或迭代器,我最终会得到分配给它自己的索引号的每个数字,而不是每行得到它自己的索引号。这是我的……你能帮我吗 为澄清目的编辑: 我将查询文件与包含图像集合的模板文件进行比较,以获得10个最近邻。查询文件包含一个“集合”(缺少更好的描述)。模板文件包含138行数据。现在,我想做的就是打印模板文件中的每一行数据,以及.dat文件中相应的索引号,但格式允许我进行必要的计算。一旦所有这些都完成了,我将需要计算两个向量之间的余弦(一个查询和模板中的第I行),因此我实际上需要断开模板的第I行,以便计算它和查询文件之间的余弦。这更清楚吗 以下是指向查询文件的链接: 以下是指向模板文件的链接: 示例输出类似于:“001_AU01_查询:15 20 135 19 36 22 105 95 55 68”,其中数字表示与查询数据最匹配的相应模板文件的行号 再次感谢你的帮助C++ c++;从给定的.dat文件将字符串向量转换为双精度向量,c++,file-io,vector,C++,File Io,Vector,所以我有很多问题,但我将从我认为应该是简单的问题开始。我被指派比较模板文件和查询文件,计算点积,并返回10个最近邻。我想我可以相当容易地进行计算,但是我在处理文件I/o时遇到了困难。我能够将数据读入字符串向量,但我不确定如何将其转换为双精度向量,同时保持顶点的完整性。如果我尝试使用字符串流或迭代器,我最终会得到分配给它自己的索引号的每个数字,而不是每行得到它自己的索引号。这是我的……你能帮我吗 为澄清目的编辑: 我将查询文件与包含图像集合的模板文件进行比较,以获得10个最近邻。查询文件包含一个“
void NearestNeighbor::readQuery(){
vector<string> queryVector;
string line;
ifstream queryData;
queryData.open("001_AU01_query.dat");
if (queryData.fail()) {
cout << "Unable to read query.dat file";
exit(1);
}
//populate the vector with the template info
while(getline(queryData, line, '\n')){
queryVector.push_back(line);
}
//this prints the contents of the queryVector to the console
for ( unsigned int i = 0; i < (queryVector.size()); i++){
cout << "Index[" << i << "] " << queryVector[i] << endl;
}
queryData.close();
}//end readQuery()
void NearestNeighbor::readQuery(){
向量查询向量机;
弦线;
ifstream queryData;
queryData.open(“001_AU01_query.dat”);
if(queryData.fail()){
cout您只需要选择正确的数据结构,其他一切都应该从该结构开始
由于无法跟踪每行数据中的值,因此单个一维向量
将不起作用。但是,向量
适合于将值存储在单行数据中。然后,每行只需要一个向量
因此,更合适的数据结构应该是向量
。即2D向量:
void readQuery(std::istream& queryData){
std::vector<std::vector<double>> queryVector;
std::string line;
while(getline(queryData, line, '\n'))
queryVector.push_back(splitData(line));
for (unsigned i = 0u; i != queryVector.size(); ++i) {
std::cout << "Index[" << i << "] ";
for(double value : queryVector[i])
std::cout << value << " ";
std::cout << "\n";
}
}
在你的程序中没有“索引号”,只有向量中的位置,显然每个元素都有自己的位置。你不能有vector
在向量中的同一个索引中有几个双精度。我认为你需要更好地解释这个问题,这可能会让你更好地理解它。一条“线”怎么办与“数字”对应?您的整个问题太模糊,任何人都无法提供帮助。如果您能向我们展示一个示例输入及其预期输出,那将更加清晰。@anmolSinghJaggi我更新了问题,将指向示例查询和模板数据以及预期输出的链接包括在内。再次感谢。这与我认为我需要的内容非常相似。自动输入是什么= 0U,但是…是那个助推还是C++ 11?我怎么用普通的OL’C++来做这个?谢谢你的帮助!@ USER 881751是的,代码“自动<代码>是C++ 11。我已经删除它了,因为用法有点无用。但是在我的例子中可能还有其他C++ 11(例如,基于范围的循环值超过一行中的值)。C++ C++ 11是C++的规则,C++ 14和C++是新的标准。现场演示链接。好的。我将把我的项目更新为C++11。我看过很多,所以使用它和/或新标准也是有意义的。我不确定它是否会在我学校的服务器上编译,但尝试一下也无妨。我真的很感谢你花时间帮助我。这些东西会让相对聪明的人觉得愚蠢,所以有时。我已经将我的项目更新为C++11,这正是我需要它做的。非常感谢。
std::vector<double> splitData(const std::string& line) {
std::istringstream iss(line);
std::istream_iterator<double> begin(iss);
std::istream_iterator<double> end;
return {begin, end};
}