所以我有很多问题,但我会从我认为应该是一个简单的问题开始。我已经获得了将模板文件与查询文件进行比较,计算点积并返回10个最近邻居的任务。我想我可以很容易地进行计算,但是我对文件i / o很难。我能够将数据读入字符串向量,但我不确定如何将其转换为双向量,同时保持顶点的完整性。如果我尝试使用字符串流或迭代器,我最终会为每个数字分配它自己的索引号,而不是每行都获得它自己的索引号。这就是我所拥有的......你能帮助我吗?
为澄清目的而编辑:
我将查询文件与包含图像集合的模板文件进行比较,以获得10个最近邻居。查询文件包含一个" set" (缺乏更好的描述)。模板文件包含138行数据。现在,我想要做的就是从模板文件中打印出来自.dat文件的相应索引号的每一行数据,但格式允许我进行必要的计算。一旦完成所有操作,我将需要计算两个向量之间的余弦(查询和模板中的第i行),因此我实际上需要突破模板的第i行以计算它之间的余弦和查询文件。那更清楚了吗?
以下是查询文件的链接:https://www.dropbox.com/s/6xytafmojrct3lh/001_AU01_query.dat?dl=0 这是指向模板文件的链接:https://www.dropbox.com/s/vnqi7h1btxdsf9u/001_template.dat?dl=0
示例输出类似于:" 001_AU01_query:15 20 135 19 36 22 105 95 55 68"其中数字表示与查询数据最匹配的相应模板文件的行号。
再一次,我非常感谢你的帮助。
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()
如果您认为有帮助,我很乐意发布输入和预期输出的样本。 提前谢谢!
答案 0 :(得分:1)
您只需要选择正确的数据结构,其他所有内容都应该从中流出。
单个1维vector<double>
将无效,因为您无法跟踪每行数据中的值。但是,vector<double>
适合将值存储在单行数据中。然后你只需要为每一行提供其中一个。
因此,更合适的数据结构将是vector<vector<double>>
。即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";
}
}
这需要一个函数splitData
将string
拆分为vector<double>
。你可以在SO上找到关于分割字符串的最佳方法的大量例子(和辩论),但是一个示例实现可能是:
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};
}