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