C++ 将字符串向量转换为给定.dat文件中的双精度向量



所以我有很多问题,但我会从我认为应该很容易的问题开始。我接到了一项任务,将模板文件与查询文件进行比较,计算点积,并返回 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>将不起作用,因为您无法跟踪数据的每一行中的值。但是,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";
  }
}

这需要一个函数splitDatastring拆分为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};
}

现场演示现场演示 C++03

最新更新