具有随机变量条目的矩阵的适当数据结构是什么?

时间:2011-01-08 19:16:05

标签: matlab matrix random data-structures simulation

我目前正在一个与模拟相关的领域工作,并试图设计一个可以在矩阵中包含随机变量的数据结构。为了激励这一点,我想说我有以下矩阵:

[a b; c d]

我想找到一个允许a, b, c, d为实数或随机变量的数据结构。例如,让我们说a = 1b = -1c = 2,但让d为正态分布的随机变量,均值为0,标准差为1。

我想到的数据结构对d没有任何价值。但是,我还希望能够设计一个可以接受结构的函数,模拟uniform(0,1),使用反向CDF获取d的值,然后吐出实际的矩阵。

我有几个想法(所有与MATLAB icdf函数相关)但想知道更有经验的程序员如何做到这一点。在这个应用程序中,重要的是结构尽可能“精益”,因为我将使用非常大的矩阵并且内存将是一个问题。

编辑#1:

谢谢大家的反馈。我决定使用单元格结构并将随机变量存储为函数句柄。为了节省大规模应用程序的处理时间,我决定引用随机变量的位置以节省“评估”部分的时间。

2 个答案:

答案 0 :(得分:3)

一种解决方案是最初将矩阵创建为包含数值的cell array和用于为该条目生成值的函数function handles。对于您的示例,您可以执行以下操作:

generatorMatrix = {1 -1; 2 @randn};

然后你可以创建一个函数,它接受上面形式的矩阵evaluates the cells containing function handles,然后将结果与create a numeric matrix的数字单元格条目组合起来用于进一步的计算:

function numMatrix = create_matrix(generatorMatrix)
  index = cellfun(@(c) isa(c,'function_handle'),...  %# Find function handles
                  generatorMatrix);
  generatorMatrix(index) = cellfun(@feval,...        %# Evaluate functions
                                   generatorMatrix(index),...
                                   'UniformOutput',false);
  numMatrix = cell2mat(generatorMatrix);  %# Change from cell to numeric matrix
end

您可以做的其他一些事情是使用anonymous functions使用内置函数执行更复杂的操作或创建不同大小的单元格条目。这可以通过以下样本矩阵来说明,该矩阵可用于创建矩阵,第一行包含5后跟9个,另外9行包含1,后跟9个数字,从5到10之间的均匀分布中绘制:

generatorMatrix = {5 ones(1,9); ones(9,1) @() 5*rand(9)+5};

每次将此矩阵传递给create_matrix时,它将创建一个新的10×10矩阵,其中9乘9子矩阵将包含一组不同的随机值。


另一种解决方案......

如果你的矩阵可以很容易地分解成子矩阵块(如上面的第二个例子),那么使用单元格数组存储数值和函数句柄可能是你最好的选择。

但是,如果随机值是在整个矩阵中稀疏散布的单个元素,那么类似于user57368 suggested的变化可能更好。您可以将矩阵数据存储为三个部分:带有占位符的数字矩阵(例如NaN),其中随机生成的值将是,包含linear indices随机生成位置的索引向量值,以及与包含function handles的索引向量长度相同的单元格数组,用于生成随机值的函数。为了简化操作,您甚至可以将这三个数据存储在structure

作为一个例子,下面定义了一个3乘3的矩阵,其中3个随机值存储在索引2,4和9中,分别从normal distribution,a uniform distribution从5到10,和exponential distribution

matData = struct('numMatrix',[1 nan 3; nan 2 4; 0 5 nan],...
                 'randIndex',[2 4 9],...
                 'randFcns',{{@randn , @() 5*rand+5 , @() -log(rand)/2}});

您可以定义一个新的create_matrix函数,以便根据此数据轻松创建矩阵:

function numMatrix = create_matrix(matData)
  numMatrix = matData.numMatrix;
  numMatrix(matData.randIndex) = cellfun(@feval,matData.randFcns);
end

答案 1 :(得分:1)

如果您使用的是NumPy,那么屏蔽数组将是明显的起点,但我不知道在MATLAB中有任何等价物。单元格数组可能不够紧凑,如果您确实使用了单元格数组,那么您必须找到一种有效的方法来查找非实数条目,并用正确分布中的样本替换它们。

尝试使用常规或稀疏矩阵来保存实际值,并将其保留为零,无论您想要随机变量。然后在该存储旁边存在相同形状的稀疏矩阵,其非零条目对应于矩阵中的随机变量。如果需要,可以使用第二个矩阵中的条目值来指示哪个分布(即1表示统一,2表示正常,等等)。

无论何时想要使用纯粹的矩阵,都要迭代第二个矩阵中的非零值,将它们转换为样本,然后将该矩阵添加到第一个矩阵中。