我希望绘制双变量(独立)高斯的热图。为了在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);
这非常慢。有没有办法避免循环?
答案 0 :(得分:2)
可以入侵normpdf.m
并在vectorized manner中获取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.');
如果您有兴趣进一步加快速度,可以分别在x(:)
和y(:)
预先计算出dim1
和dim2
的更多内容!