MATLAB - 在网格中的每个点评估一个函数



我想绘制双变量(独立)高斯的热图。为了在 2D 正方形上绘制它,我做了

joint_pdf = @(m, s) normpdf(m, 1, 1)*normpdf(s, 1, 1);
[x, y] = meshgrid(0:0.1:10, 0:0.1:10);
prob_map = zeros(numel(x), numel(y));
for idx1 = 1:size(prob_map, 1)
    for idx2 = 1:size(prob_map, 2)
        prob_map(idx1, idx2) = joint_pdf(x(idx1), y(idx2));
    end
end
image(prob_map);

这是非常非常慢的。有没有办法避免循环?

人们可以入侵normpdf.m并以矢量化的方式获取prob_map的所有元素,从而避免那些许多函数调用,这必须使其更有效率。我喜欢将这种黑客方法称为使用normpdf实现的"原始版本"。这是最终代码 -

%// Define arrays for inputting into meshgrid
array1 = 0:0.1:10;
array2 = 0:0.1:10;
[x, y] = meshgrid(array1, array2);
%// Define parameteres for normpdf
mu = 1;
sigma = 1;
%// Use "raw version" of normpdf to calculate all prob_map elements in one go
dim1 = exp(-0.5 * ((x(:) - mu)./sigma).^2) ./ (sqrt(2*pi) .* sigma);
dim2 = exp(-0.5 * ((y(:) - mu)./sigma).^2) ./ (sqrt(2*pi) .* sigma);
prob_map = bsxfun(@times,dim1,dim2.');

如果您有兴趣进一步加快速度,您可以分别在dim1dim2中预先计算围绕x(:)y(:)的更多内容!

最新更新