MatLab:一峰一息递减矩阵

MatLab:一峰一息递减矩阵,matlab,matrix,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和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处有一个峰值,所有其他数字随着远离该峰值而减少


我想不出一个好方法来生成这样做的代码。有什么想法吗?我需要能够生成这种具有随机峰值和随机下降率的矩阵

在不知道要实施哪些其他约束的情况下:

得出一个函数z=fx,y,其峰值在x0处,y0==0,0,其值范围在[0,1]之间。例如,mu=0且sigma=1/sqrt2*pi的正态分布的PDF在x==0的1.0处有一个峰值,其下限为零。类似地,具有mu={0,0}和determineseSigma==[1/2*pi]^2的二元正态PDF将具有类似的特征。 任何数学函数的域都可能发生偏移:fx-x0,y-y0 您的代码将如下所示:

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)' );
% 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 ) ...
                       );
你可以阅读更多关于;但是,下面是一个如何工作的示例:

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的点大于较远的点,则制作程序函数而不是使用严格的数学函数将不是问题

针对你的回答:

你的方程可以被认为是重力模型,物体在瞬间对另一个物体产生力,然后停止施加力。按照这一逻辑,可以将其修改为如下简单的向量公式:

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)' );
% 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 . . ]
。。。其中,您需要相对于X1和X2的w/值。使用上面的表达式,它将归结为A=X1/normv1+X2/normv2,这肯定会超过X1处的峰值,因为normv1==1。你当然可以做一些肮脏的事情来帮助它,但我个人会开始寻找不同的功能。 按照这些思路,如果您进行了一些修改:

你不需要G的类似物,所以你可以假设G==1 将矩阵中的每个点视为质量m2==1,因此方程简化为:F_12==-1*m1/r^2*RHAT_12 求和力向量并计算范数以获得每个值 。。。你仍然会遇到同样的问题。我在上面列出的拐角案例可以归结为A=X1/normv1^2+X2/normv2^2==X1+X2/4。因为它与距离的平方成反比,所以它比线性的更容易,但我不推荐。 类似地,如果你使用多项式,它也不能很好地伸缩;你可以设计一个永远不会超过你选择的峰值,但不会有一个下限

您可以使用来帮助:

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

在点2&4处有峰值的4次多项式上使用logistic函数的方法;你会注意到,我给了多项式一个比例因子,将多项式向下拉到相对较小的值,这样计算出的值就不会太接近了。

我最终创建了一个代码,根据我提供的维度,以我想要的方式进行包装。代码如下:

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/距离


它似乎工作得很好。我现在正试图开发一种好方法,在同一个正方形中有多个峰值,而不让一个峰值完全覆盖另一个峰值

在您的示例中,1,5小于1,4和1,6。这是个错误吗?@RobertP。2,5,5,5和6,5都是一样的。我只是想解释一下,是的,这些都是愚蠢的错误。只要你明白我的目标。这就是我们最初想要创建这个矩阵的方式。然而,问题是我们需要能够创造数百个随机变量;有些差异较大,最大值=0.99,最小值=0.01,有些差异较小,最大值=0.05,最小值=0等。因此,我们认为创建函数并不理想。你对此有什么建议吗?你可以让你的函数做任何你想做的事情。它可以是过程性的if语句,for循环,等等,非确定性的,不管你想要什么。像我一样使用匿名函数会有点尴尬,但是bsxfun和类似的函数将允许更一般的函数形式[ABC]=myFunctionx,y,z%{…}%,作为对您所说内容的响应,我将修改我的答案,因为在答案中比在co中更容易 梅门特。