高斯随机函数

时间:2014-04-14 17:34:13

标签: matlab noise-generator

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

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

Gaussian = normrnd([1 45],[1 45],[1 500],length(c_t));

我收到以下错误,

Size information is inconsistent.

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

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

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

这就是为什么我想创建一个可变噪声模型,normrnd将此模型添加到理想特征并计算噪声(Sigma)Vs误差 - 这个分析将给出一个近似估计不同模型如何表现随变化噪声和哪种模型适用于估算示踪剂的化学动力学。

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

上述功能的输出特性如下,这里我无法看到任何噪音

enter image description here

2 个答案:

答案 0 :(得分:1)

您想要完成的唯一远程关闭事项可以按如下方式完成,但是会涉及循环,因为您不能仅从45种不同的方法和差异中请求500个数据点,而不必假设可以重新访问多个集合。

这是我对你想要的解释,虽然我还不完全确定。

随机高斯函数选择

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)

以上代码生成均值和方差的随机2-D矩阵(1st col = mean,2nd col = variance)。然后我们预先分配一些空间。

在循环内部,我们选择一组随机均值和方差(均匀),然后取均值和方差,将其插入随机高斯值函数,并存储它。

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

顺序功能选择

如果您不想随机选择要使用的函数,只想按顺序循环使用模数来获取要使用的值集的索引。

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 :(得分:0)

此声明的问题

Gaussian = normrnd([1 45],[1 45],[1 500],length(c_t));

是你提供两个mu值和两个sigma值,并要求一个大小为[1 500] x长度(c_t)的矩阵。你需要以统一的方式传递大小,所以

Gaussian = normrnd(mu, sigma,[500 length(c_t)]);

Gaussian = normrnd(mu, sigma, 500, length(c_t));

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

要从具有固定均值和稳定增长西格玛的正态分布中获得N值,您可以执行

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个值,您可以执行

noise(0,1,5,10)

如果你想在西格玛的增加中引入一些随机性你可以做

noise_rand = @(mu, s0, s1, n) normrnd(mu, (s0:(s1-s0)/(n-1):s1) .* rand(1,n), 1,n)