1

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

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

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

我收到以下错误,

Size information is inconsistent.

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

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

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

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

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

上述函数的输出特性如下,这里我无法想象任何噪音

在此处输入图像描述

4

2 回答 2

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)

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

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

该矩阵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)
于 2014-04-14T18:07:10.013 回答
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 length(c_t) 矩阵作为输出,你需要传递 500 x length(c_t) (mu,sigma) 对。如果您只想改变 mu 或 sigma 之一,您可以为另一个参数传递单个值

要从具有固定均值和稳定增加 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)

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

noise_rand = @(mu, s0, s1, n) normrnd(mu, (s0:(s1-s0)/(n-1):s1) .* rand(1,n), 1,n)
于 2014-04-14T17:45:33.653 回答