首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >高斯随机函数

高斯随机函数
EN

Stack Overflow用户
提问于 2014-04-15 01:34:13
回答 2查看 2.1K关注 0票数 1

通过使用normrnd,我想创建一个正态分布函数,均值和sigma值表示为大小为1x45的向量,大小从1:45变化,并用理想值绘制这个模拟的PDF。

每当我创建如下所示的normrnd时,

代码语言:javascript
复制
Gaussian = normrnd([1 45],[1 45],[1 500],length(c_t));

我正在获取以下错误,

代码语言:javascript
复制
Size information is inconsistent.

创建此PDF的原因是为了计算具有可变高斯噪声模型的示踪剂的化学动力学。基本上,我有一个理想的示踪剂特性,现在我想添加高斯噪声,并了解示踪剂的化学动力学如何随着噪声的变化而变化。

了解示踪剂的化学动力学基本上有不同的计算模型,其中一种是三室模型,另一种是形状分析模型、约束形状分析模型。

我目前对所有的模型都有理想的曲线,现在我想向这些模型添加噪声,并了解每个特定模型在不同噪声下的行为。

这就是为什么我想用normrnd创建一个可变噪声模型,将此模型添加到理想特性并计算噪声(Sigma) Vs误差-This分析将给我一个近似估计不同模型在不同噪声下的行为,以及哪个模型适合估计示踪剂的化学动力学。

代码语言:javascript
复制
function [c_t,c_t_noise] =Noise_ConstrainedK2(t,a1,a2,a3,b1,b2,b3,td,tmax,k1,k2,k3)

    K_1   = (k1*k2)/(k2+k3);
    K_2   = (k1*k3)/(k2+k3);
    %DV_free= k1/(k2+k3);

    c_t = zeros(size(t));
    ind = (t > td) & (t < tmax);
    c_t(ind)= conv(((t(ind) - td) ./ (tmax - td) * (a1 + a2 + a3)),(K_1*exp(-(k2+k3)*t(ind)+K_2)),'same');
    ind = (t >= tmax);

    c_t(ind)=conv((a1 * exp(-b1 * (t(ind) - tmax))+ a2 * exp(-b2 * (t(ind) - tmax))) + a3 * exp(-b3 * (t(ind) - tmax)),(K_1*exp(-(k2+k3)*t(ind)+K_2)),'same');

    meanAndVar = (rand(45,2)-0.5)*2;
    numPoints = 500;
    randSamples = zeros(1,numPoints);
    for ii = 1:numPoints
        idx = mod(ii,size(meanAndVar,1))+1;
        randSamples(ii) = normrnd(meanAndVar(idx,1),meanAndVar(idx,2));
        c_t_noise = c_t + randSamples(ii);
    end
    scatter(1:numPoints,randSamples)

    dg = [0 0.5 0];
    plot(t,c_t,'r');
    hold on;
    plot(t,c_t_noise,'Color',dg);
    hold off; 

    axis([0 50 0 1900]);
    xlabel('Time[mins]');
    ylabel('concentration [Mbq]');
    title('My signal');

    %plot(t,c_tnp);
end

上面函数的输出特征如下所示,这里我看不到任何噪声

EN

回答 2

Stack Overflow用户

发布于 2014-04-15 02:07:10

唯一与你想要做的事情很接近的事情可以这样做,但会涉及循环,因为你不能从只有45个不同的均值和方差中请求500个数据点,而不需要假设可以重新访问多个集合。

这就是我对你想要的东西的理解,尽管我仍然不能完全确定。

随机高斯函数选择

代码语言:javascript
复制
meanAndVar = rand(45,2);
numPoints = 500;
randSamples = zeros(1,numPoints);
for ii = 1:numPoints
    randMeanVarIdx = randi([1,size(meanAndVar,1)]);
    randSamples(ii) = normrnd(meanAndVar(randMeanVarIdx,1),meanAndVar(randMeanVarIdx,2));
end
scatter(1:numPoints,randSamples)

上面的代码生成一个随机的二维均值和方差矩阵(第一列=均值,第二列=方差)。然后我们预先分配一些空间。

在循环中,我们选择一组随机的均值和方差(统一地),然后取均值和方差,将其插入到随机高斯值函数中,并将其存储。

矩阵randSamples将包含由以随机均匀方式选择的一组随机高斯函数生成的随机值的列表。

顺序功能选择

如果您不想随机选择要使用的函数,而只是想按顺序执行,则可以使用模数循环来获得要使用的值集的索引。

代码语言:javascript
复制
meanAndVar = (rand(45,2)-0.5)*2; % zero shift and make bounds [-1,1]
numPoints = 500;
randSamples = zeros(1,numPoints);
for ii = 1:numPoints
    idx = mod(ii,size(meanAndVar,1))+1;
    randSamples(ii) = normrnd(meanAndVar(idx,1),meanAndVar(idx,2));
end
scatter(1:numPoints,randSamples)
票数 1
EN

Stack Overflow用户

发布于 2014-04-15 01:45:34

这条语句的问题是

代码语言:javascript
复制
Gaussian = normrnd([1 45],[1 45],[1 500],length(c_t));

就是提供两个µ值和两个sigma值,并请求一个大小为1500 x length(c_t)的矩阵。您需要以统一的方式传递大小,因此

代码语言:javascript
复制
Gaussian = normrnd(mu, sigma,[500 length(c_t)]);

代码语言:javascript
复制
Gaussian = normrnd(mu, sigma, 500, length(c_t));

然后,您应该确保µ/sigma向量的大小与您要求的矩阵的大小相匹配。因此,如果您想要一个500x长度(C_t)矩阵作为输出,您需要传递500x长度(C_t)(µ,sigma)对。如果您只想改变µ或sigma中的一个,则可以为另一个参数传递单个值

要从具有固定均值和稳步增加的sigma的正态分布中获得N值,您可以这样做

代码语言:javascript
复制
noise = @(mu, s0, s1, n) normrnd(mu, s0:(s1-s0)/(n-1):s1, 1,n)

其中s0是最低的sigma值,s1是最大的sigma值。要从mu=0和sigma从1增加到5的分布中提取10个值,您可以这样做

代码语言:javascript
复制
noise(0,1,5,10)

如果你想在sigma的增长中引入一些随机性,你可以这样做

代码语言:javascript
复制
noise_rand = @(mu, s0, s1, n) normrnd(mu, (s0:(s1-s0)/(n-1):s1) .* rand(1,n), 1,n)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23066521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档