在网格上的不同点放置高斯函数

时间:2015-11-19 16:21:14

标签: matlab random gaussian

我希望在大网格上创建高斯曲线形状的随机分布。我基本上想要这个功能:

Z = 0.3*exp(-5*(x.^2+y.^2))-0.1;
Z(Z<0)=0;

并且能够选择其位置(在x&amp; y coords中),并且有多个图。

所以目前,我有这个:

Single Point

但我想生成这个:

Distributed

有一个相当简单的方法吗?我试着玩代码,但恐怕我不是数学,也不是MATLAB专家。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:4)

看看这个!

这种方式有效:

  1. 生成随机点
  2. 检查点是否比sigma更近
  3. 如果不是,那就在那里创造一个高斯!
  4. 重复,直到Ngaussians到达
  5. 代码:

    clear
    n_gaussians=15;
    gaussians=0;
    sigma=1; % std
    mindist=sigma; % if distance is smaller than this gaussians "collide"
    
    [x,y]= meshgrid(-5:0.1:5,-5:0.1:5);
    used=[];
    Z=zeros(size(x));
    while gaussians<n_gaussians
    
        xm=(rand(1)-0.5)*10;
        ym=(rand(1)-0.5)*10;
        notvalid=0;
        for ii=1:size(used,2)
            % if we are too close to any point.
           if norm([xm-used(1,ii),ym-used(2,ii)])<mindist
               notvalid=1; % do not add this gauusian
           end
        end
        if notvalid
            continue
        end
        used(:,end+1)=[xm;ym];
        Zaux = 0.3/sigma*exp(-5*((x-xm).^2+(y-ym).^2)/sigma.^2)-0.1;
        Zaux(Zaux<0)=0;
        Z=Z+Zaux;
        gaussians=gaussians+1;
    end
    
    surf(x,y,Z);
    axis equal
    

    enter image description here