2015-03-11 3 views
0

У меня есть следующий код. По существу он создает N случайных нормальных переменных и работает через уравнение M раз для моделирования.C++ Рекомендации по управлению выходом Матричные данные

Выходной сигнал должен быть матрицей данных NxM, однако единственный способ, которым я мог бы выполнять вычисление, иметь выход как MxN. т.е. каждый пробег M должен быть столбцом, а не строкой. Я тщетно попытался выполнить некоторые другие предложения, которые были опубликованы в предыдущих похожих темах.

Код:

#include <iostream> 
#include <time.h> 
#include <random> 

int main() 
{ 
    double T = 1; // End time period for simulation 
    int N = 4; // Number of time steps 
    int M = 2; // Number of simulations 
    double x0 = 1.00; // Starting x value 
    double mu = 0.00; // mu(x,t) value 
    double sig = 1.00; // sigma(x,t) value 
    double dt = T/N; 
    double sqrt_dt = sqrt(dt); 
    double** SDE_X = new double*[M]; // SDE Matrix setup 
    // Random Number generation setup 
    double RAND_N; 
    srand ((unsigned int) time(NULL)); // Generator loop reset 
    std::default_random_engine generator (rand()); 
    std::normal_distribution<double> distribution (0.0,1.0); // Mean = 0.0, Variance = 1.0 ie Normal 

    for (int i = 0; i < M; i++) 
    { 
     SDE_X[i] = new double[N]; 

     for (int j=0; j < N; j++) 
      { 
       RAND_N = distribution(generator); 
       SDE_X[i][0] = x0; 
       SDE_X[i][j+1] = SDE_X[i][j] + mu * dt + sig * RAND_N * sqrt_dt; // The SDE we wish to plot the path for 

       std::cout << SDE_X[i][j] << " "; 
      } 

     std::cout << std::endl; 
    } 
    std::cout << std::endl; 
    std::cout << " The simulation is complete!!" << std::endl; 
    std::cout << std::endl; 
    system("pause"); 
    return 0; 
} 
+0

У вас будет больше шансов получить помощь, если вы обратитесь к другим вопросам, на которые вы смотрите, и объясните, почему их ответы не помогли решить вашу проблему. –

+0

У вас есть C++ 11, так почему вы не используете 2d-вектор для хранения вашей матрицы? Почему вы посеяли старый ранд, чтобы генерировать случайное значение, чтобы засеять новый ранд? –

+0

Я использую Visual studio 2010. Не думаю, что это C++ 11 (полностью). не распознается так, как обходной путь, который я отправил и засеял rand(). как для 2d-вектора ... Я посмотрю, посмотрю, смогу ли я заставить его работать. –

ответ

0

Ну почему вы не можете просто создать транспонирование вашей SDE_X матрицы тогда? Разве это не то, что вы хотите получить?

+0

Хороший Idea.http: //stackoverflow.com/questions/14846905/transposing-a-matrix-c –

0

Имейте в виду, что это представление не имеет ничего общего с реализацией. Доступ к столбцам или строкам - это ваше решение. Поэтому вы хотите, чтобы реализация была перенесена. Затем быстро и грязно сначала создайте свою матрицу, а затем создайте свою цифровую серию. Изменить я и J и N и M.

Я сказал быстро и грязно, потому что программа вообще плохо:

  1. почему вы не просто держать его простым и использовать лучшую структуру данных для ваша матрица? Если вы знаете размер: массив времени компиляции или динамические векторы во время выполнения? Возможно, есть более приятная реализация для массива 2d.
  2. Есть ошибка, о которой я думаю: вы создаете N удвоений и индекс доступа от 0 до N включительно.
  3. На каждой итерации вы устанавливаете индекс от 0 до x0, что тоже бесполезно.

Я хотел бы изменить свой код немного сделать более ясным:

  1. создать матрицу в первую
  2. инициализировать первое значение матрицы
  3. обеспечить функцию алгоритма вычисления целевой ячейки взятие матрицы и параметров.
  4. Пройдите через каждую клетку и вызвать вашу функцию для этой ячейки
+0

Отличный совет.Спасибо. Будет держать отключение –

+0

Спасибо Aitch. Я просмотрел свой код. смог разобраться с другим циклом. Индексирование от 0 до N включительно необходимо для моих нужд. –

+0

затем выделите N + 1 двухместных. Если вы напишете 'double double [N]', вы получите N удвоений от нуля до N-1. вы не должны обращаться к элементу N! – Aitch

0

Спасибо всем за вход. Я смог реализовать свой код и отобразить его по мере необходимости. Я добавил второй цикл для перестановки строк и столбцов матрицы. Пожалуйста, не стесняйтесь, дайте мне знать, если вы думаете, что в любом случае я могу улучшить его.

#include <iostream> 
#include <time.h> 
#include <random> 
#include <vector> 


int main() 
{ 
    double T = 1; // End time period for simulation 
    int N = 3; // Number of time steps 
    int M = 2; // Number of simulations 
    int X = 100; // Max number of matrix columns 
    int Y = 100; // Max number of matrix rows 
    double x0 = 1.00; // Starting x value 
    double mu = 0.00; // mu(x,t) value 
    double sig = 1.00; // sigma(x,t) value 
    double dt = T/N; 
    double sqrt_dt = sqrt(dt); 

    std::vector<std::vector<double>> SDE_X((M*N), std::vector<double>((M*N))); // SDE Matrix setup 

    // Random Number generation setup 
    double RAND_N; 
    srand ((unsigned int) time(NULL)); // Generator loop reset 
    std::default_random_engine generator (rand()); 
    std::normal_distribution<double> distribution (0.0,1.0); // Mean = 0.0, Variance = 1.0 ie Normal 

    for (int i = 0; i <= M; i++) 
    { 
     SDE_X[i][0] = x0; 

     for (int j=0; j <= N; j++) 
      { 
       RAND_N = distribution(generator); 
       SDE_X[i][j+1] = SDE_X[i][j] + mu * dt + sig * RAND_N * sqrt_dt; // The SDE we wish to plot the path for 
      } 
    } 

    for (int j = 0; j <= N; j++) 
    { 
     for (int i = 0; i <=M; i++) 
     { 
      std::cout << SDE_X[i][j] << ", "; 
     } 

     std::cout << std::endl; 
    } 

    std::cout << std::endl; 
    std::cout << " The simulation is complete!!" << std::endl; 
    std::cout << std::endl; 
    system("pause"); 
    return 0; 
} 
Смежные вопросы