我目前正在一个与模拟相关的领域工作,并试图设计一个可以在矩阵中包含随机变量的数据结构。为了激励这一点,我想说我有以下矩阵:
[a b; c d]
我想找到一个允许a, b, c, d
为实数或随机变量的数据结构。例如,让我们说a = 1
,b = -1
,c = 2
,但让d
为正态分布的随机变量,均值为0,标准差为1。
我想到的数据结构对d
没有任何价值。但是,我还希望能够设计一个可以接受结构的函数,模拟uniform(0,1)
,使用反向CDF获取d
的值,然后吐出实际的矩阵。
我有几个想法(所有与MATLAB icdf
函数相关)但想知道更有经验的程序员如何做到这一点。在这个应用程序中,重要的是结构尽可能“精益”,因为我将使用非常大的矩阵并且内存将是一个问题。
编辑#1:
谢谢大家的反馈。我决定使用单元格结构并将随机变量存储为函数句柄。为了节省大规模应用程序的处理时间,我决定引用随机变量的位置以节省“评估”部分的时间。
答案 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表示正常,等等)。
无论何时想要使用纯粹的矩阵,都要迭代第二个矩阵中的非零值,将它们转换为样本,然后将该矩阵添加到第一个矩阵中。