我正在编写一个模拟,需要一些关于设计的提示。基本思想是生成给定随机过程的数据,然后用于各种计算。例如对于 1 次迭代:
- 流程 1 -> 为源 1 生成数据:x1
- 过程 2 -> 为源 1 生成数据:x2
- 等等
稍后我想对源 2 的输出应用一些转换,这会导致 x2a、x2b、x2c。所以最终得到以下向量:[x1, x2a, x2b, x2c]。
我有一个问题,至于 N 多元随机过程(例如代表多个相关现象)我必须一次生成 N 维样本:
- 过程 1 -> 为源 1...N 生成数据:x1...xN
我正在考虑一种简单的架构,它允许结构化模拟代码并提供灵活性而不影响性能。
我在想一些事情(伪代码):
class random_process
{
// concrete processes would generate and store last data
virtual data_ptr operator()() const = 0;
};
class source_proxy
{
container_type<process> processes;
container_type<data_ptr> data; // pointers to the process data storage
data operator[](size_type number) const { return *(data[number]);}
void next() const {/* update the processes */}
};
不知何故,我不相信这种设计。例如,如果我想使用样本向量而不是单次迭代,那么应该更改上述设计(例如,我可以让进程用数据填充传递给它们的代理矩阵的子矩阵,但又一次不确定这是否是一个好主意-如果是,那么它也很适合单次迭代情况)。欢迎任何意见、建议和批评。
编辑:
对上面的文字进行简短的总结,以总结要点并澄清情况:
random_processes
包含生成一些数据的逻辑。例如,它可以从具有给定均值和相关矩阵的多元随机高斯中抽取样本。例如,我可以使用 Cholesky 分解 - 结果,我将获得一组样本 [x1 x2 ... xN]- 我可以有多个具有不同维度和参数的随机进程
- 我想对生成的单个元素进行一些转换
random_processes
这是数据流图
random_processes 输出 x1 --------------> x1 ----> x2a p1 x2 ------------变换|----> x2b ----> x2c x3 --------------> x3 p2 y1 ------------变换|----> y1a ----> y1b
输出用于进行一些计算。