poster
2019-12-14, 20:38
我目前在与仿真相关的领域中工作,并试图设计一种可以在矩阵中包含随机变量的数据结构。为了激发这一点,让我说我有以下矩阵:
[ab; cd] 我想找到一个允许a, b, c, d为实数或随机变量的数据结构。举例来说,假设a = 1 , b = -1 , c = 2但d为正态分布的随机变量,平均值为0,标准差为1。
我想到的数据结构对d没有任何价值。但是,我还希望能够设计一个函数,该函数可以采用结构,模拟uniform(0,1) ,使用逆CDF获得d的值,然后吐出实际矩阵。
我有几个想法可以做到这一点(所有这些都与MATLAB icdf函数有关),但我想知道更有经验的程序员将如何做到这一点。在此应用程序中,结构尽可能“精简”很重要,因为我将使用非常大的矩阵,而内存将成为一个问题。
编辑#1:
谢谢大家的反馈。我决定使用单元格结构并将随机变量存储为函数句柄。为了节省大规模应用程序的处理时间,我决定参考随机变量的位置以节省“评估”部分的时间。
回答:
一种解决方案是首先将您的矩阵创建为一个单元格数组, (http://www.mathworks.com/help/techdoc/ref/cell.html)其中既包含数值又包含设计用于为该条目生成值的函数的函数句柄 (http://www.mathworks.com/help/techdoc/ref/function_handle.html) 。对于您的示例,您可以执行以下操作:
generatorMatrix = {1 -1; 2 @randn}; 然后,您可以创建一个采用上述形式的矩阵的函数, 对包含函数句柄的单元格进行求值 (http://www.mathworks.com/help/techdoc/ref/feval.html) ,然后将结果与数字单元格条目合并以创建一个数字矩阵 (http://www.mathworks.com/help/techdoc/ref/cell2mat.html)以用于进一步的计算:
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 您可以做的其他一些事情是使用匿名函数 (http://www.mathworks.com/help/techdoc/matlab_prog/f4-70115.html)使用内置函数 (http://www.mathworks.com/help/techdoc/matlab_prog/f4-70115.html)来做更复杂的事情,或者创建大小不同的单元格条目。下面的示例矩阵对此进行了说明,该示例矩阵可用于创建一个矩阵,其中第一行包含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建议 (https://stackoverflow.com/questions/4635654/matlab-appropriate-data-structure-for-a-matrix-with-random-variable-entries/4635888#4635888)的变化可能会更好。您可以将矩阵数据存储为三部分:带有占位符(例如NaN (http://www.mathworks.com/help/techdoc/ref/nan.html) )的数字矩阵,随机生成的值将进入该位置,包含随机生成值的位置的线性索引 (http://www.mathworks.com/help/techdoc/math/f1-85462.html#f1-85511)的索引向量,以及与包含用于处理 (http://www.mathworks.com/help/techdoc/ref/function_handle.html)随机值的函数的函数的句柄的 (http://www.mathworks.com/help/techdoc/ref/function_handle.html)长度相同。为了使事情变得简单,您甚至可以将这三个数据存储在一个结构中 (http://www.mathworks.com/help/techdoc/ref/struct.html) 。
例如,下面定义了一个3×3矩阵,其中3个随机值存储在索引2、4和9中,分别从正态分布 (http://www.mathworks.com/help/techdoc/ref/randn.html) ,从5到10的均匀分布 (http://www.mathworks.com/help/techdoc/ref/rand.html)以及指数分布中 (http://en.wikipedia.org/wiki/Exponential_distribution#Generating_exponential_variates)得出:
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
更多&回答... (https://stackoverflow.com/questions/4635654)
[ab; cd] 我想找到一个允许a, b, c, d为实数或随机变量的数据结构。举例来说,假设a = 1 , b = -1 , c = 2但d为正态分布的随机变量,平均值为0,标准差为1。
我想到的数据结构对d没有任何价值。但是,我还希望能够设计一个函数,该函数可以采用结构,模拟uniform(0,1) ,使用逆CDF获得d的值,然后吐出实际矩阵。
我有几个想法可以做到这一点(所有这些都与MATLAB icdf函数有关),但我想知道更有经验的程序员将如何做到这一点。在此应用程序中,结构尽可能“精简”很重要,因为我将使用非常大的矩阵,而内存将成为一个问题。
编辑#1:
谢谢大家的反馈。我决定使用单元格结构并将随机变量存储为函数句柄。为了节省大规模应用程序的处理时间,我决定参考随机变量的位置以节省“评估”部分的时间。
回答:
一种解决方案是首先将您的矩阵创建为一个单元格数组, (http://www.mathworks.com/help/techdoc/ref/cell.html)其中既包含数值又包含设计用于为该条目生成值的函数的函数句柄 (http://www.mathworks.com/help/techdoc/ref/function_handle.html) 。对于您的示例,您可以执行以下操作:
generatorMatrix = {1 -1; 2 @randn}; 然后,您可以创建一个采用上述形式的矩阵的函数, 对包含函数句柄的单元格进行求值 (http://www.mathworks.com/help/techdoc/ref/feval.html) ,然后将结果与数字单元格条目合并以创建一个数字矩阵 (http://www.mathworks.com/help/techdoc/ref/cell2mat.html)以用于进一步的计算:
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 您可以做的其他一些事情是使用匿名函数 (http://www.mathworks.com/help/techdoc/matlab_prog/f4-70115.html)使用内置函数 (http://www.mathworks.com/help/techdoc/matlab_prog/f4-70115.html)来做更复杂的事情,或者创建大小不同的单元格条目。下面的示例矩阵对此进行了说明,该示例矩阵可用于创建一个矩阵,其中第一行包含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建议 (https://stackoverflow.com/questions/4635654/matlab-appropriate-data-structure-for-a-matrix-with-random-variable-entries/4635888#4635888)的变化可能会更好。您可以将矩阵数据存储为三部分:带有占位符(例如NaN (http://www.mathworks.com/help/techdoc/ref/nan.html) )的数字矩阵,随机生成的值将进入该位置,包含随机生成值的位置的线性索引 (http://www.mathworks.com/help/techdoc/math/f1-85462.html#f1-85511)的索引向量,以及与包含用于处理 (http://www.mathworks.com/help/techdoc/ref/function_handle.html)随机值的函数的函数的句柄的 (http://www.mathworks.com/help/techdoc/ref/function_handle.html)长度相同。为了使事情变得简单,您甚至可以将这三个数据存储在一个结构中 (http://www.mathworks.com/help/techdoc/ref/struct.html) 。
例如,下面定义了一个3×3矩阵,其中3个随机值存储在索引2、4和9中,分别从正态分布 (http://www.mathworks.com/help/techdoc/ref/randn.html) ,从5到10的均匀分布 (http://www.mathworks.com/help/techdoc/ref/rand.html)以及指数分布中 (http://en.wikipedia.org/wiki/Exponential_distribution#Generating_exponential_variates)得出:
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
更多&回答... (https://stackoverflow.com/questions/4635654)