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

操作输出矩阵数据的C++建议,c++,matrix,output,C++,Matrix,Output,我有以下代码。 本质上,它是创建N个随机正态变量,并通过一个方程M次进行模拟 输出应该是一个NxM数据矩阵,但是我唯一可以进行计算的方法是将输出作为MxN。即每个M运行应该是一列,而不是一行。 我试图遵循在以前类似主题上发布的一些其他建议,但没有成功 代码: 那么为什么你不能创建SDE_X矩阵的转置呢?这不是您想要的吗?请记住,该演示与实现无关。是访问列还是访问行是您的决定。所以你需要一个转置的实现。然后先快速创建矩阵,然后创建数字系列。改变i和j,N和M 我说“快”和“脏”,因为程序根本就不好

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

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

代码:


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

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

我说“快”和“脏”,因为程序根本就不好:

为什么不保持简单,为矩阵使用更好的数据结构呢?如果您知道大小:编译时数组还是运行时的动态向量?也许有更好的2d阵列实现。 我认为有一个bug:创建N个double并访问索引0到N(包括)。 在每次迭代中,将索引0设置为x0,这也是不必要的。 我会稍微修改一下您的代码,让您更清楚:

首先创建矩阵 初始化矩阵的第一个值 提供一个算法函数,用于根据矩阵和参数计算目标单元。 遍历每个单元格并调用该单元格的函数
谢谢大家的意见。我能够实现我的代码,并根据需要显示它。 我添加了第二个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;
} 

如果你链接到你看过的其他问题,并具体解释为什么他们的答案不能解决你的问题,你更有可能得到帮助。你有C++11,为什么不使用2d向量来存储你的矩阵呢?为什么要对旧rand进行种子设定以生成一个随机值来对新rand进行种子设定?我使用的是Visual studio 2010。不要认为它完全是C++11。没有被认可,所以我去了兰德公司做种子。至于二维向量。。。我会看看我是否能让它工作;干杯,尼尔,我用了你的建议。是的,我是个笨蛋非常好的建议。谢谢你。我会一直坚持下去的。我检查了我的密码。能够用另一个for循环解决它。从0到N(含)的索引对于我的需要是必要的。然后分配N+1个双倍。如果你写新的双精度[N],你会得到从0到N-1的N个双精度。您不能访问项目N!你在谈论我的代码的哪一部分?SDE_X[i]=new double[N]。。。对于int j=0;j#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; }