2012-03-28 13 views
3

我不是程序員,但是我是一名需要使用C++編碼的工程師,所以很抱歉如果這個問題有點基本。非常大的查找表C++ - 我可以避免輸入整個事情嗎?

我需要使用查找表,因爲我有一些高度非線性的動態變化,我需要建模。它由字面上1000個配對值組成,從一對(0.022815,0.7)直到(6.9453,21.85)。

我不想在我的C代碼中輸入所有這些值。這些值目前存儲在Matlab中。我可以從.dat文件或類似的文件中讀取它們嗎?

我將計算一個值,並且只是希望程序踢出配對值。

感謝,

亞當

+0

也許是最容易的事是打印所有這些值在從MATLAB的格式,使得解析容易純文本文件,然後讀取該文件來自您的C++應用程序。 – akappa 2012-03-28 10:48:22

+0

如果它是靜態數據,請將'n'paste和massage(使用perl或您最喜愛的工具)複製到源文件(頭文件或其他文件)中。保存在打字上。如果數據經常變化,則不太實際。 – 2012-03-28 10:49:19

+2

與您的問題沒有密切關係,但您應該避免使用浮點數作爲您的地圖的關鍵字。 – Adrien 2012-03-28 11:08:57

回答

0

是的,你可以從dat文件閱讀。問題是,dat文件是什麼格式?一旦你知道,你要使用:

fopen 
fread 
fclose 

C和

ifstream 

用於C++(或類似的東西)。

0

程序仍然需要從文件中獲取這些對並將它們加載到內存中。你可以遍歷文件中的行,解析這些對並將它們推入std :: map中。 像這樣:

#include<fstream> 
#include<map> 
... 
ifstream infile("yourdatfile.dat"); 
std::string str; 
std::map<double, double> m; //use appropriate type(s) 
while(getline(infile, str)){ 
//split str by comma or some delimiter and get the key, value 
//put key, value in m 
} 
//use m 
-1

其中一個選項是生成在MATLAB中C++查找表。只需寫入一些文本文件(lookup.cpp),讀取產生C++源代碼的表...

6

你不能直接讀取存儲在Matlab中的東西,除非你想爲Matlab存儲其數據的任何格式編寫一個解析器我不是 熟悉Matlab,但如果它不具有 函數將此數據輸出到某個文件,您可以使用 可讀取和解析的某種文本格式,我會非常驚訝。

假設這是恆定的數據,如果它能夠輸出的東西沿 行:

{ 0.022815, 0.7 }, 
     ... 
{ 6.9453, 21.85 }, 

您可以包括它作爲一個表中的C中的初始值設定++。 (可能看起來 在變量定義中有一個#include很奇怪,但是 這是完全合法的,並且在這種情況下,是完全合理的。)或者僅僅將 複製/粘貼到您的C++程序中。

如果你不能直接得到這種格式,它應該是微不足道的 寫一個小腳本,可以將你得到的任何格式轉換成這種格式的 。

+0

從MATLAB到C/C++的數據輸入(即使它是恆定的)並不是它應該完成的方式! MATLAB有一套廣泛的用於文件I/O的內置工具,所以你可以用任何你想要的格式寫數據。我建議在MATLAB中使用fopen()和fprintf()命令(如[here](http://www.mathworks.com/help/techdoc/ref/fprintf.html))將數據轉儲到文件中,然後簡單地用你的C/C++代碼讀取它(像[這裏](http://stackoverflow.com/questions/9596128/how-to-read-floating-number-from-txt-file-in-c)) 。 – 2012-05-10 09:55:23

1

該程序定義了一張地圖,然後從a.txt文件讀取,插入地圖,出於任何目的在地圖上迭代,最後將地圖寫入文件。 只是一個簡單的做法:

#include <fstream> 
#include <iostream> 
#include <map> 
using namespace std; 

int main(){ 
    ifstream inFile("a.txt", ios::in); 

    if (! inFile){ 
     cout<<"unabl to open"; 
     return 0; 
    } 

    //reading a file and inserting in a map 
    map<double,double> mymap; 
    double a,b; 
    while(! inFile.eof() ){ 
     inFile>>a>>b; 
     mymap.insert (a,b); 
    } 
    inFile.close(); //be sure to close the file 

    //iterating on map 
    map<double,double>::iterator it; 
    for (it=mymap.begin() ; it != mymap.end(); it++){ 
      // (*it).first 
      // (*it).second 
    } 

    //writing the map into a file 
    ofstream outFile; 
    outFile.open ("a.txt", ios::out); // or ios::app if you want to append 

    for (it=mymap.begin() ; it != mymap.end(); it++){ 
     outFile << (*it).first << " - " << (*it).second << endl; //what ever! 
    } 

    outFile.close(); 
    return 0; 
} 
1

我會爲這個做的是如下,因爲我認爲這是比文件快打開和關閉。首先創建一個包含數組中所有數據的頭文件。你可以在記事本中使用「全部替換」,以便將()括號替換爲{}括號。後來,你甚至可以編寫一個腳本,從MATLAB使得頭文件文件

>> cat import_data.h 
#define TBL_SIZE 4 // In your case it is 1000 

const double table[TBL_SIZE][2] = 
{ 
    { 0.022815, 0.7 }, 
    { 6.9453, 21.85 }, 
    { 4.666, 565.9}, 
    { 567.9, 34.6} 

}; 

現在在主程序中,你有這個頭也爲數據

>> cat lookup.c 
#include <stdio.h> 
#include "import_data.h" 

double lookup(double key) 
{ 
    int i=0; 
    for(;i<TBL_SIZE; i++) { 
     if(table[i][0] == key) 
      return table[i][1]; 
    } 
    return -1; //error 
} 


int main() { 
    printf("1. Value is %f\n", lookup(6.9453)); 
    printf("2. Value is %f\n", lookup(4.666)); 
    printf("3. Value is %f\n", lookup(4.6)); 
    return 0; 
} 
相關問題