C ++关于操作输出矩阵数据的建议

时间:2015-03-11 00:29:32

标签: c++ matrix output

我有以下代码。 基本上它是创建N个随机正态变量,并通过M次方程运行模拟。

输出应该是NxM数据矩阵,但是我可以进行计算的唯一方法是输出为MxN。即每个M run应该是一列,而不是一行。 我试图遵循以前类似主题上发布的其他一些建议是徒劳的。

代码:

#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;
}

3 个答案:

答案 0 :(得分:0)

那你为什么不能创建SDE_X矩阵的转置呢?这不是你想得到的吗?

答案 1 :(得分:0)

请记住,该演示文稿与实施无关。是您访问列还是行是您的决定。所以你想要一个转置的实现。然后快速和脏地创建您的矩阵,然后创建您的数字系列。改变i和j,以及N和M.

我说快速而且肮脏,因为程序根本不好:

  1. 为什么不保持简单并为矩阵使用更好的数据结构?如果您知道大小:编译时数组或运行时的动态向量?也许有一些更好的2D阵列实现。
  2. 我认为有一个错误:您创建N个双打并访问索引0到N包含。
  3. 在每次迭代中,您将索引0设置为x0,这也是不必要的。
  4. 我会更改一下你的代码:

    1. 首先创建矩阵
    2. 初始化矩阵的第一个值
    3. 提供计算目标单元格的算法函数,该矩阵和参数。
    4. 浏览每个单元格并调用该单元格的函数

答案 2 :(得分:0)

谢谢大家的意见。我能够实现我的代码并根据需要显示它。 我添加了第二个for循环来重新排列矩阵行和列。 如果您认为无论如何我可以改进它,请随时告诉我。

#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;
}