Matlab formula optimization: Radial Basis Function

后端 未结 2 1791
滥情空心
滥情空心 2020-12-19 07:39
  • z - matrix of doubles, size Nx2;
  • x - matrix of doubles, size Nx2;

sup = x(i, :);

phi(1, i) = {@(z) exp(-g * sum((z -

2条回答
  •  悲&欢浪女
    2020-12-19 08:40

    It seems in your recent edits, you introduced some syntax errors, but I think I understood what you were trying to do (from the first version).

    Instead of using REPMAT or indexing to repeat the vector x(i,:) to match the rows of z, consider using the efficient BSXFUN function:

    rbf(:,i) = exp( -g .* sum(bsxfun(@minus,z,x(i,:)).^2,2) );
    

    The above obviously loops over every row of x


    You can go one step further, and use the PDIST2 to compute the euclidean distance between every pair of rows in z and x:

    %# some random data
    X = rand(10,2);
    Z = rand(10,2);
    g = 0.5;
    
    %# one-line solution
    rbf = exp(-g .* pdist2(Z,X,'euclidean').^2);
    

    Now every value in the matrix: rbf(i,j) corresponds to the function value between z(i,:) and x(j,:)


    EDIT:

    I timed the different methods, here is the code I used:

    %# some random data
    N = 5000;
    X = rand(N,2);
    Z = rand(N,2);
    g = 0.5;
    
    %# PDIST2
    tic
    rbf1 = exp(-g .* pdist2(Z,X,'euclidean').^2);
    toc
    
    %# BSXFUN+loop
    tic
    rbf2 = zeros(N,N);
    for j=1:N
        rbf2(:,j) = exp( -g .* sum(bsxfun(@minus,Z,X(j,:)).^2,2) );
    end
    toc
    
    %# REPMAT+loop
    tic
    rbf3 = zeros(N,N);
    for j=1:N
        rbf3(:,j) = exp( -g .* sum((Z-repmat(X(j,:),[N 1])).^2,2) );
    end
    toc
    
    %# check if results are equal
    all( abs(rbf1(:)-rbf2(:)) < 1e-15 )
    all( abs(rbf2(:)-rbf3(:)) < 1e-15 )
    

    The results:

    Elapsed time is 2.108313 seconds.     # PDIST2
    Elapsed time is 1.975865 seconds.     # BSXFUN
    Elapsed time is 2.706201 seconds.     # REPMAT
    

提交回复
热议问题