Очень большая справочная таблица C ++ - можно ли избежать распечатки всего этого? - PullRequest
3 голосов
/ 28 марта 2012

Я не программист, но инженер, который должен использовать C ++ кодирование в этом случае, поэтому извините, если этот вопрос является немного основным.

Мне нужно использовать справочную таблицу, так как у меня происходит очень нелинейная динамика, которую мне нужно смоделировать. Он состоит буквально из 1000 парных значений, от пары (0,022815, 0,7) до (6,9453, 21,85).

Я не хочу печатать все эти значения в моем C-коде. В настоящее время значения хранятся в Matlab. Могу ли я прочитать их из файла .dat или чего-то подобного?

Я вычислю значение и просто хочу, чтобы программа выбросила парное значение.

Спасибо

Адам

Ответы [ 7 ]

6 голосов
/ 28 марта 2012

Вы не можете прочитать что-то, хранящееся в Matlab напрямую, если вы не хотите написать парсер для любого формата, в котором Matlab хранит свои данные. Я не знаком с Matlab, но я был бы очень удивлен, если бы этого не былофункция для вывода этих данных в файл в каком-либо текстовом формате, который вы можете прочитать и проанализировать.

Предполагая, что это постоянные данные, если бы он мог выводить что-то вроде:

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

, вы могли бы включить его в качестве инициализатора таблицы в C ++.(Может показаться странным иметь #include в середине определения переменной, но это совершенно законно, и в таких случаях совершенно оправдано.) Или просто скопируйте / вставьте его в свою программу C ++.

Если вы не можете получить именно этот формат напрямую, написать небольшой скрипт, который бы конвертировал любой формат, который вы получаете в этот формат, было бы тривиально.

1 голос
/ 28 марта 2012

Для этого я бы сделал следующее: я думаю, что это быстрее, чем открывать и закрывать файлы.Прежде всего создайте заголовочный файл, который содержит все данные в массиве.Вы можете «заменить все», доступные в Блокноте или около того, чтобы заменить скобки () на скобки {}.Позже вы могли бы даже написать скрипт, который делает заголовочный файл из файла 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;
}
1 голос
/ 28 марта 2012

эта программа определяет карту, затем читает из файла .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;
}
0 голосов
/ 28 марта 2012

Для набора инструментов обработки сигналов вы можете экспортировать данные в заголовочные файлы C напрямую из Matlab (не знаю, является ли это вашим конкретным случаем):

Экспорт Matlab в заголовок C

Или может быть полезна следующая статья:

Экспорт / импорт данных в / из MATLAB

0 голосов
/ 28 марта 2012

Один из вариантов - создать таблицу поиска C ++ в Matlab.Просто запишите в какой-нибудь текстовый файл (lookup.cpp), прочитайте таблицу с источником C ++ ...

0 голосов
/ 28 марта 2012

Программа все еще должна получить эти пары из файла и загрузить их в память. Вы можете перебирать строки в файле, анализировать пары и помещать их в 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
0 голосов
/ 28 марта 2012

Да, вы можете прочитать их из файла данных.Вопрос в том, в каком формате находится файл dat?Как только вы это знаете, вы хотите использовать:

fopen
fread
fclose

для C и

ifstream

для C ++ (или что-то подобное).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...