【发布时间】:2014-12-03 21:06:04
【问题描述】:
所以我有很多问题,但我会从我认为应该很简单的问题开始。我被分配了一项任务,将模板文件与查询文件进行比较,计算点积,并返回 10 个最近的邻居。我想我可以很容易地进行计算,但是我很难处理文件 i/o。我能够将数据读入字符串向量,但我不确定如何在保持顶点完整性的同时将其转换为双精度向量。如果我尝试使用字符串流或迭代器,我最终会为每个数字分配它自己的索引号,而不是每行都获得它自己的索引号。这就是我所拥有的……你能帮帮我吗?
为澄清目的而编辑:
我将查询文件与包含图像集合的模板文件进行比较,以获得 10 个最近的邻居。一个查询文件包含一个“集合”(因为没有更好的描述)。一个模板文件包含 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()
如果您认为这会有所帮助,我很乐意发布输入和预期输出的示例。 提前致谢!
【问题讨论】:
-
你的程序中没有“索引号”,只有向量中的位置,显然每个元素都有自己的位置。你不能有
vector<double>,其中几个双精度数在向量中的同一索引处。我认为你需要更好地解释这个问题,这可能会让你更好地理解它。 “线”如何对应“数字”?你的整个问题太模糊了,任何人都无法提供帮助。 -
如果您能向我们展示一个示例输入及其预期输出,那就更清楚了。
-
@anmolSinghJaggi 我更新了问题以包含指向示例查询和模板数据的链接以及预期的输出。再次感谢。