为数学目的声明矩阵的简单方法是什么?

时间:2018-06-07 19:10:37

标签: arrays c++11 math matrix

我的目标是初始化一个大小为m x 3的矩阵,并用从 for loop 获得的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的错误消息。我也希望在这些计算中使用庞大的数组,因此任何其他建议都会很棒。

2 个答案:

答案 0 :(得分:2)

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

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

使用std::vector代替std::array

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

您还需要更改返回类型。

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

答案 1 :(得分:0)

如果你有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