我不是程序员,但是我是一名需要在这种情况下使用C ++编码的工程师,很抱歉,如果这个问题有点基础。
我需要使用查找表,因为我需要建模一些高度非线性的动态。它由1000对配对值组成,从一对(0.022815,0.7)到(6.9453,21.85)。
我不想在我的C代码中输入所有这些值。这些值当前存储在Matlab中。我可以从.dat文件或类似文件中读取它们吗?
我将计算一个值,只是希望程序提出配对值。
谢谢,
亚当
答案 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(不知道这是你的具体情况):
或许以下文章可能有所帮助:
答案 6 :(得分:-1)
其中一个选项是在matlab中生成C ++查找表。只需写入一些文本文件(lookup.cpp),读取生成C ++源代码的表...