MatLab:具有一个峰值和休息减少的矩阵

时间:2014-07-08 18:50:23

标签: matlab matrix

我试图创建一个矩阵,这样如果我定义一个0到1之间的随机数和矩阵中的随机位置,我希望围绕它的所有值到"漫反射"出。这是一个例子:

0.214  0.432  0.531  0.631  0.593  0.642
0.389  0.467  0.587  0.723  0.654  0.689
0.421  0.523  0.743  0.812  0.765  0.754
0.543  0.612  0.732  0.843  0.889  0.743
0.322  0.543  0.661  0.732  0.643  0.694
0.221  0.321  0.492  0.643  0.521  0.598

如果你注意到,在(4,5)= 0.889处有一个峰值,所有其他数字随着它们离开那个峰值而减少。

我无法找到一种很好的方法来生成执行此操作的代码。有什么想法吗?我需要能够生成这种具有随机峰值和随机减少率的矩阵......

2 个答案:

答案 0 :(得分:0)

不知道您想要实施的其他限制:

  1. 提出一个函数z = f(x,y),其峰值为(x0,y0) == (0,0),其值介于[0,1]之间。例如,包含mu = 0sigma = 1/sqrt(2*pi)的正态分布的PDF在x == 0处的峰值为1.0,其下限为零。同样,具有mu = {0,0}determinate(sigma) == [1/(2*pi)]^2的双变量普通PDF也具有相似的特征。
  2. 任何数学函数都可能会移动其域名:f(x-x0, y-y0)
  3. 您的代码将如下所示:

    someFunction = @(x,y) theFunctionYouPicked(x,y);
    
    [x0,y0,peak] = %{ you supply these values %};
    myFunction = @(x,y) peak * someFunction(x - x0, y - y0);
    
    [dimX,dimY] = %{ you supply these values %};
    mymatrix = bsxfun( myFunction, 0:dimX, (0:dimY)' );
    

    您可以阅读有关bsxfun here的更多信息;然而,这是一个如何运作的例子:

    bsxfun( blah, [a b c], [d e f]' )
    

    那应该给出以下矩阵(或它的转置......我没有在我面前的matlab):

    [blah(a,d) blah(a,e) blah(a,f);
     blah(b,d) blah(b,e) blah(b,f);
     blah(c,d) blah(c,e) blah(c,f)]
    

    让玩具示例工作,然后你可以修补它以更灵活。如果指示它如何减少的函数是随机的(具有更接近(x0,y0)的点的约束比更远的点更大),那么制作程序函数而不是严格使用数学函数将不是问题。 / p>


    回答你的回答:

    你的等式可以被认为是引力的模型,物体瞬间在另一个质量上引起一个力,然后停止施加力。遵循这个逻辑,它可以修改为这样的天真矢量公式:

    % v1 & v2 are vectors that point from the two peak points to the point [ii,jj]
    theMatrix(ii,jj) = norm(  (r1 / norm( v1 )) * v1 / norm( v1 ) ...
                            + (r2 / norm( v2 )) * v2 / norm( v2 ) ...
                           );
    

    你遇到的最极端类型的角落案例是v1& v2指向与下一行相同的方向:

    [ . . A X1 X2 . . ]
    

    ...你想要一个值A w /相对于X1& X2。使用上面的表达式,它将归结为A = X1 / norm(v1) + X2 / norm(v2),这肯定会超过X1的峰值,因为norm(v1) == 1。你当然可以为Band-Aid做一些肮脏的事情,但我个人会开始寻找不同的功能。

    除此之外,如果您使用Newton's Law of Universal Gravitation进行了一些修改:

    • 您不需要G的模拟,所以您可以假设G == 1
    • 将矩阵中的每个点视为具有质量m2 == 1,因此等式简化为:F_12 == -1 * (m1 / r^2) * RHAT_12
    • 求和“力”向量并计算得到每个值的范数

    ...你仍会遇到同样的问题。我上面列出的角落案例将归结为A = X1/norm(v1)^2 + X2/norm(v2)^2 == X1 + X2/4。由于它与距离的平方成反比,所以它比带线性的更容易创造,但我不推荐它。

    同样,如果使用多项式,它将无法很好地扩展;你可以设计一个不会超过你选择的峰值,但不会有下限。

    您可以使用logistic function来帮助解决此问题:

    1 / (1 + E^(-c*x))
    

    Here's an example在4阶多项式上使用逻辑函数,在点2和2处有峰值。 4;你会注意到我给多项式一个比例因子来将多项式下拉到相对较小的值,因此计算出的值不是很接近。

答案 1 :(得分:0)

我最终根据我提供的维度创建了一个包含我想要的方式的代码。这是代码:

dims = 100;
A = zeros(dims);

b = floor(1+dims*rand(1));
c = floor(1+dims*rand(1));

d = rand(1);

x1 = c;
y1 = b;

A(x1,y1) = d;

for i = 1:dims
    for j = i
        k = 1-j;

        while k <= j
            if x1-j>0 && y1+k>0 && y1+k <= dims
                if A(x1-j,y1+k) == 0
                    A(x1-j,y1+k) = eqn(d,x1-j,y1+k,x1,y1);
                end
            end

            k = k+1;
        end

    end

    for k = i
        j = 1-k;
        while j<=k
            if x1+j>0 && y1+k>0 && y1+k <= dims && x1+j <= dims
                if A(x1+j,y1+k)==0
                    A(x1+j, y1+k) = eqn(d,x1+j,y1+k,x1,y1);
                end
            end

            j = j+1;
        end
    end

    for j = i
        k = 1-j;
        while k<=j
            if x1+j>0 && y1-k>0 && x1+j <= dims && y1-k<= dims
                if A(x1+j,y1-k) == 0
                    A(x1+j,y1-k) = eqn(d,x1+j,y1-k,x1,y1);
                end
            end

            k=k+1;
        end
    end

    for k = i
        j = 1-k;
        while j<=k
            if x1-j>0 && y1-k>0 && x1-j <= dims && y1-k<= dims
                if A(x1-j,y1-k)==0
                    A(x1-j,y1-k) = eqn(d,x1-j,y1-k,x1,y1);
                end
            end

            j = j+1;
        end
    end
end

colormap('hot');
imagesc(A);
colorbar;

如果你注意到,代码调用一个函数(我称之为eqn),它提供了如何更改每个单元格中的值的信息。我确定的功能是d /距离(使用标准距离公式计算距离)。

它看起来效果很好。我现在只是试图开发一种在同一个方格中有多个峰值的好方法,而没有一个峰值完全覆盖另一个峰值。