在 C++ 中将 matlab 矩阵转换为数组的有效方法
Posted
技术标签:
【中文标题】在 C++ 中将 matlab 矩阵转换为数组的有效方法【英文标题】:Efficient way of converting matlab matrix to array in c++ 【发布时间】:2013-07-11 10:35:22 【问题描述】:我有一个 Matlab 代码,我应该将其转换为 c++。 在一个文件中有很多矩阵,我想将它们转换为数组(或向量)。我需要转换这些矩阵的有效方法。
f = [ -.000212080863 .000358589677 .002178236305 ...
-.004159358782 -.010131117538 .023408156762 ...
.028168029062 -.091920010549 -.052043163216 ...
.421566206729 .774289603740 .437991626228 ...
-.062035963906 -.105574208706 .041289208741 ...
.032683574283 -.019761779012 -.009164231153 ...
.006764185419 .002433373209 -.001662863769 ...
-.000638131296 .000302259520 .000140541149 ...
-.000041340484 -.000021315014 .000003734597 ...
.000002063806 -.000000167408 -.000000095158 ];
我尝试过这样的事情,但我所有的尝试都出现了一些错误。
int* first;
first = new int[5];
first = 1,2,3,4,5;
注意:我可以手动将[
改为。
谢谢,
【问题讨论】:
我建议你使用一些像eigen这样的线性代数库 请您再解释一下好吗? 【参考方案1】:如果值是恒定的(例如,每次要更改值时您很乐意重新编译),那么您可以这样做:
double f[] = -.000212080863, .000358589677, .002178236305, ... ;
(注意添加了逗号和大括号而不是方括号)。
如果值发生变化,那么您想使用vector<double> f;
,稍微清理一下输入并使用类似:
ifstream infile("numbers.txt");
while(infile >> value)
f.push_back(value);
【讨论】:
【参考方案2】:你可以这样使用:
PMatrix MatrixData::factory(string parser)
typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
// Verifica formattazione matrice
if (!((parser[0]=='' && parser[parser.size()-1] == '')||(parser[0]=='[' && parser[parser.size()-1] == ']')))
assert( (std::cout<<"Wrong matrix structure"<<std::endl, 0) );
// Verifica struttura matrice
boost::char_separator<char> row_sep("[];");
boost::char_separator<char> col_sep(",");
unsigned int row_number,col_number;
tokenizer::iterator rowtok_iter;
tokenizer::iterator coltok_iter;
row_number = 0;
tokenizer rowtokens(parser, row_sep);
for (rowtok_iter = rowtokens.begin();rowtok_iter != rowtokens.end(); ++rowtok_iter)
row_number++;
col_number = 0;
tokenizer coltokens(*rowtokens.begin(), col_sep);
col_number = std::distance(coltokens.begin(),coltokens.end());
//cout << row_number << " rows and " << col_number << " columns" << endl;
unsigned int active_row_col_number;
double* values = new double[col_number*row_number];
unsigned int i = 0;
for (rowtok_iter = rowtokens.begin();rowtok_iter != rowtokens.end(); ++rowtok_iter)
active_row_col_number = 0;
tokenizer coltokens1(*rowtok_iter, col_sep);
for (coltok_iter = coltokens1.begin();coltok_iter != coltokens1.end();++coltok_iter)
active_row_col_number++;
values[i]=strtod(coltok_iter->c_str(),0);
i++;
if (active_row_col_number!=col_number)
assert( (std::cout<<"Wrong matrix structure 1"<<std::endl, 0) );
PMatrix ret = MatrixData::factory(row_number,col_number,values);
delete[] values;
return ret;
它直接从字符串中解析出 Matlab 格式的矩阵,并将结果放入“值”中。
这不是你能想象的最干净的代码,但它可以被清理掉。如您所见,它正在使用 boost::tokenizer。希望对您有所帮助。
【讨论】:
看起来不错,但我不想一直从matlab读取,我想将其转换为c++代码一次,不再返回matlab。 您不想阅读 matlab 格式的字符串,这是您的意思吗?当然,这不是从 matlab 读取的。您只需像在 factory("1,2,3,4,5"); (它适用于 matlab 和 c sintax)【参考方案3】:如果你的编译器支持,你也可以使用初始化列表
vector<double> f -.000212080863, .000358589677, ... // replace elipses with other numerical values
这将为您提供矢量大小不受堆栈限制的优势。请记住,matlab 使用矩阵的列顺序,因此在转换它们时需要小心。
【讨论】:
以上是关于在 C++ 中将 matlab 矩阵转换为数组的有效方法的主要内容,如果未能解决你的问题,请参考以下文章