Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
回复
 
主题工具 显示模式
旧 2019-12-14, 20:38   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 具有随机变量条目的矩阵的合适数据结构是什么?

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

[ab; cd] 我想找到一个允许a, b, c, d为实数或随机变量的数据结构。举例来说,假设a = 1 , b = -1 , c = 2但d为正态分布的随机变量,平均值为0,标准差为1。

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

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

编辑#1:

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



回答:

一种解决方案是首先将您的矩阵创建为一个单元格数组,其中既包含数值又包含设计用于为该条目生成值的函数的函数句柄 。对于您的示例,您可以执行以下操作:

generatorMatrix = {1 -1; 2 @randn}; 然后,您可以创建一个采用上述形式的矩阵的函数, 对包含函数句柄的单元格进行求值 ,然后将结果与数字单元格条目合并以创建一个数字矩阵以用于进一步的计算:

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 您可以做的其他一些事情是使用匿名函数使用内置函数来做更复杂的事情,或者创建大小不同的单元格条目。下面的示例矩阵对此进行了说明,该示例矩阵可用于创建一个矩阵,其中第一行包含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建议的变化可能会更好。您可以将矩阵数据存储为三部分:带有占位符(例如NaN )的数字矩阵,随机生成的值将进入该位置,包含随机生成值的位置的线性索引的索引向量,以及与包含用于处理随机值的函数的函数的句柄的长度相同。为了使事情变得简单,您甚至可以将这三个数据存储在一个结构中

例如,下面定义了一个3×3矩阵,其中3个随机值存储在索引2、4和9中,分别从正态分布 ,从5到10的均匀分布以及指数分布中得出:

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

更多&回答...
poster 当前离线   回复时引用此帖
回复


发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



所有时间均为北京时间。现在的时间是 23:51


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.