【问题标题】:Efficient way of converting matlab matrix to array in c++在 C++ 中将 matlab 矩阵转换为数组的有效方法
【发布时间】:2025-12-01 02:40:01
【问题描述】:

我有一个 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这样的线性代数库
  • 请您再解释一下好吗?

标签: c++ arrays matlab matrix


【解决方案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 使用矩阵的列顺序,因此在转换它们时需要小心。

    【讨论】:

      最近更新 更多