2013-07-11 82 views
1

我有一個Matlab代碼,我應該將它轉換爲C++。 在一個文件中有很多矩陣,我想將它們轉換爲數組(或向量)。我需要有效的方式來轉換這些矩陣。將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

我建議你使用一些線性代數庫,如特徵 –

+0

請問你能解釋一下嗎? – smttsp

回答

2

如果值是恆定的(如,你是幸福的重新編譯要改變這些值每次),那麼你可以做:

double f[] = { -.000212080863, .000358589677, .002178236305, ... }; 

(注添加逗號,花括號而不是方括號)。

如果數值變化,那麼你要使用vector<double> f;,清理輸入了一下,使用這樣的:

ifstream infile("numbers.txt"); 
while(infile >> value) 
{ 
    f.push_back(value); 
} 
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。希望能幫助到你。

+0

它看起來不錯,但我不想一直讀取matlab,我想將它轉換成C++代碼一次,而不是再次返回到matlab。 – smttsp

+0

你不想讀取matlab格式的字符串,這是你的意思嗎?當然這不會讀取「from」matlab。您只需在工廠中調用該函數(「{1,2,3,4,5}」); (它可以與matlab和c sintax一起使用) –

0

如果編譯器支持的話,你也可以使用一個初始化列表

vector<double> f{ -.000212080863, .000358589677, ...} // replace elipses with other numerical values 

這會給你,你矢量大小不疊加有限的優勢。請記住,matlab使用矩陣的列順序,所以在轉換時需要小心。