2014-12-03 2 views
3

그래서 많은 질문이 있지만 쉬운 것으로 생각되는 것으로 시작하겠습니다. 템플릿 파일을 쿼리 파일과 비교하고, 내적을 계산하고, 가장 가까운 이웃을 반환하는 과제를 받았습니다. 나는 계산을 상당히 쉽게 할 수 있다고 생각하지만 파일 I/O에 어려움을 겪고있다. 데이터의 문자열을 벡터로 읽을 수는 있지만 정점의 무결성을 유지하면서 벡터를 복소수로 변환하는 방법을 모르겠습니다. 문자열 스트림 또는 반복기를 사용하려고하면 각 줄에 자체 색인 번호가 할당되는 대신 자체 색인 번호가 할당 된 각 번호를 얻게됩니다. 여기 내가 가진 건 .. 날 도와 줄 수있어? 명확한 목적C++ 문자열의 벡터를 주어진 .dat 파일의 복소수 벡터로 변환

편집 :

나는 10 개 가까운 이웃을 얻기 위해 이미지의 컬렉션을 포함하는 템플릿 파일로 쿼리 파일을 비교하고있다. 쿼리 파일에는 하나의 "집합"이 포함되어 있습니다 (더 자세한 설명이 없기 때문입니다). 템플릿 파일에는 138 개의 데이터 행이 들어 있습니다. 지금 당장은 템플릿 파일의 각 데이터 행을 .dat 파일의 해당 색인 번호와 함께 인쇄하지만 필요한 계산을 수행 할 수있는 형식으로 인쇄하고 있습니다. 모든 것이 끝나고 완료되면 두 벡터 (쿼리와 템플릿의 i 번째 행) 사이에서 코사인을 계산해야하므로 실제로는 템플릿의 i 번째 행을 분해하여 그 사이의 코사인을 계산해야합니다 및 쿼리 파일. 그게 더 명확한가요? "001_AU01_query : 15 20 135 19 36 22 105 95 55 68"는 https://www.dropbox.com/s/vnqi7h1btxdsf9u/001_template.dat?dl=0

샘플 출력과 같을 것이다 : https://www.dropbox.com/s/6xytafmojrct3lh/001_AU01_query.dat?dl=0 여기 템플릿 파일에 대한 링크이다 : 여기

쿼리 파일에 대한 링크의 숫자는 쿼리 데이터와 가장 일치하는 해당 템플릿 파일의 줄 번호를 나타냅니다.

또 다시 귀하의 도움에 감사드립니다.

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() 

입력 샘플 및 예상 출력을 게시하게되어 기쁘게 생각한다면 도움이 될 것입니다. 미리 감사드립니다.

+1

더 "인덱스가 없습니다 숫자 "를 벡터의 위치에 넣고, 분명히 모든 요소는 고유 한 위치를가집니다.여러 개의 double이 벡터에서 같은 인덱스에있는 곳에 'vector '을 가질 수 없습니다. 나는 당신이 문제를 더 잘 설명 할 필요가 있다고 생각한다. "라인"은 "숫자"에 어떻게 대응합니까? 귀하의 모든 질문은 누구에게나 너무 모호하여 도움을받을 수 없습니다. –

+0

샘플 입력과 예상 출력을 보여줄 수 있다면 훨씬 더 분명 할 것입니다. –

+0

@anmolSinghJaggi 샘플 쿼리 및 템플릿 데이터뿐만 아니라 예상 결과에 대한 링크를 포함하도록 질문을 업데이트했습니다. 다시 한번 감사드립니다. – user3882751

답변

1

올바른 데이터 구조 만 선택하면됩니다.

단일 1 차원 vector<double>은 데이터의 각 행에있는 값을 추적 할 수 없으므로 작동하지 않습니다. 그러나 vector<double>은 데이터의 한 행에 값을 저장하는 것이 적합합니다. 그런 다음 각 줄마다이 중 하나가 필요합니다.

따라서 더 적절한 데이터 구조는 vector<vector<double>>입니다. 즉 2 차원 벡터 :이 vector<double>string을 분할하는 기능 splitData을 필요로

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"; 
    } 
} 

. 당신은 여기에 문자열을 분할하는 가장 좋은 방법에 대한 많은 예 (및 토론을) 찾을 수 있지만 구현 예는 다음과 같을 수 있습니다

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}; 
} 

Live demo Live demo C++03

+0

이것은 내가 필요로하는 것과 많이 닮았다. 자동 i = 0u는 무엇입니까? 그 boost 또는 C++ 11입니까? 나는 이것을 regular ol 'C++로 어떻게 처리 할까? 도와 주셔서 감사합니다! – user3882751

+0

@ user3882751 예,'auto'는 C++ 11입니다. 그 사용법이 조금 불필요하기 때문에 나는 그것을 제거했습니다. 그러나 내 예제에는 다른 C++ 11이있을 수 있습니다 (예 : 한 줄의 값에 대한 범위 기반 for 루프). 내 마음 속에 C++ 11 _is_ regular ol 'C++. C++ 14 및 C++ 1z는 새로운 표준입니다. –

+0

@ user3882751 "일반 C++"라이브 데모 링크를 추가했습니다. –

관련 문제