Что такое простой способ объявить матрицу для математических целей? - PullRequest
0 голосов
/ 07 июня 2018

Моя цель - инициализировать матрицу размера mx 3 и заполнить ее строки 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 голосов
/ 08 июня 2018

Если у вас есть 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 вопрос о производительности

0 голосов
/ 07 июня 2018

Следующее недопустимо в 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(...) { ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...