【问题标题】:What is a simple way to declare a matrix for mathematical purposes?出于数学目的声明矩阵的简单方法是什么?
【发布时间】:2018-06-07 19:10:36
【问题描述】:

我的目标是初始化一个大小为 m x 3 的矩阵,并用从 for 循环获得的 1 x 3 向量(我的意思是数组)填充其行。我不确定是否要返回矩阵(通过指针)。但我对 C++ 真的很生疏(一开始不是很好)。任何建议都会很棒。这是我的代码:

#include "rk4.h"
#include <iostream>

using std::cout;
using std::endl;

double * rk4(double finalTime, double deltaTime, double Y0[])
{
    double h = 0.0009765625;    /// 1/2^10
    double t0 = 0;
    int rows = finalTime/h;
    double * Y = new double[M][3]; 

    for(int i = 0; i < 3; i++)
    {
        Y[0][i] = Y0[i];
    }

    cout << M << endl;

    for(double t = t0; t <= finalTime; t+= h)
    {
       // Insert row into Y
    }

    return Y;
}

我收到一条错误消息,上面写着cannot convert double(*)[3] to double* in initialization。此外,我希望为这些计算使用巨大的数组,因此任何其他建议都会很棒。

【问题讨论】:

    标签: arrays c++11 math matrix


    【解决方案1】:

    以下不是有效的 C++。编译器应该会让你知道。

    double * Y = new double[M][3]; 
    

    改用std::vectorstd::array

    std::vector<std::array<double, 3>> Y(M);
    

    您也需要更改返回类型。

    std::vector<std::array<double, 3>> rk4(...) { ... }
    

    【讨论】:

      【解决方案2】:

      如果你有 Boost,声明矩阵的最简单方法是使用boost::matrix

      #include <iostream>
      #include <boost/numeric/ublas/matrix.hpp>
      #include <boost/numeric/ublas/io.hpp>
      
      int main () {
          using namespace boost::numeric::ublas;
          matrix<double> m (3, 3);
          for (unsigned i = 0; i < m.size1 (); ++ i)
              for (unsigned j = 0; j < m.size2 (); ++ j)
                  m (i, j) = 3 * i + j;
          std::cout << m << std::endl;
      }
      

      Boost 也有multi_array,但已知它在某些实现中存在性能问题。如果您正在考虑采用boost::multi_array,请检查您的表现

      Boost::multi_array performance question

      【讨论】:

        猜你喜欢
        • 2019-01-07
        • 1970-01-01
        • 2022-01-01
        • 2021-03-21
        • 1970-01-01
        • 1970-01-01
        • 2015-10-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多