我有一个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};
注意:我可以手动添加逗号并将[
更改为{
。
谢谢,
答案 0 :(得分:2)
如果值是常量(例如,您很乐意每次想要更改值时重新编译),那么您可以这样做:
double f[] = { -.000212080863, .000358589677, .002178236305, ... };
(注意添加逗号和大括号而不是方括号)。
如果值正在改变,那么你想使用vector<double> f;
,稍微清理输入并使用类似的东西:
ifstream infile("numbers.txt");
while(infile >> value)
{
f.push_back(value);
}
答案 1 :(得分:1)
您可以使用以下内容:
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。希望它有所帮助。
答案 2 :(得分:0)
如果您的编译器支持它,您也可以使用初始化列表
vector<double> f{ -.000212080863, .000358589677, ...} // replace elipses with other numerical values
这将为您提供矢量大小不受堆栈限制的优势。请记住,matlab使用矩阵的列顺序,因此在转换矩阵时需要注意。