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