非常大的查找表C ++ - 我可以避免输入整个事情吗?

时间:2012-03-28 10:43:38

标签: c++ c matlab lookup

我不是程序员,但是我是一名需要在这种情况下使用C ++编码的工程师,很抱歉,如果这个问题有点基础。

我需要使用查找表,因为我需要建模一些高度非线性的动态。它由1000对配对值组成,从一对(0.022815,0.7)到(6.9453,21.85)。

我不想在我的C代码中输入所有这些值。这些值当前存储在Matlab中。我可以从.dat文件或类似文件中读取它们吗?

我将计算一个值,只是希望程序提出配对值。

谢谢,

亚当

7 个答案:

答案 0 :(得分:6)

除非您愿意,否则无法直接阅读Matlab中存储的内容 为Matlab存储数据的任何格式编写解析器。我不是 熟悉Matlab,但如果它没有,我会非常惊讶 函数将此数据输出到某个文本格式的文件中 可以阅读和解析。

假设这是常量数据,如果它可以输出一些东西 以下几行:

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

您可以将其作为C ++中表的初始化程序包含在内。 (看起来可能 在变量定义的中间有一个#include很奇怪,但是 它是完全合法的,在这种情况下,完全合理。)或者只是 将其复制/粘贴到您的C ++程序中。

如果你不能直接得到这种格式,那应该是微不足道的 写一个小脚本,可以转换你进入的任何格式 这种格式。

答案 1 :(得分: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;
}

答案 2 :(得分: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;
}

答案 3 :(得分:0)

是的,您可以从dat文件中读取它们。问题是,dat文件的格式是什么?一旦你知道,你想使用:

fopen
fread
fclose

代表C和

ifstream

用于C ++(或类似的东西)。

答案 4 :(得分: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

答案 5 :(得分:0)

对于信号处理工具箱,您可以将数据导出到C头文件 直接来自Matlab(不知道这是你的具体情况):

Matlab export to C header

或许以下文章可能有所帮助:

Exporting/Importing Data To/From MATLAB

答案 6 :(得分:-1)

其中一个选项是在matlab中生成C ++查找表。只需写入一些文本文件(lookup.cpp),读取生成C ++源代码的表...