1

我正在尝试编写一些代码来生成类似于以下 matlab 上的图(取自此处):

我在曲线上有一组点(x_i,y_i,z_i)。每个点生成一个高斯分布(均值 (x_i,y_i,z_i) 和协方差矩阵 I_3)。我所做的是将空间划分为 npoint x npoints x npoints 并计算每个点 (x,y,z) 中每个“源”(x_i,y_i,z_i) 的概率密度之和。然后,如果我得到的值足够大(比如最大密度的 95%),我会坚持这一点。否则我丢弃它。

我的代码的问题是它太慢了(很多 for 循环),而且我得到的图形看起来不像下面的图形:

有谁知道是否有一个包可以获得与下面类似的情节?

在此处输入图像描述

4

1 回答 1

1

使用等值面我们可以做得相当好。(虽然我不确定你想要什么,但我认为这很接近:

% Create a path
points = zeros(10,3);
for ii = 2:10
    points(ii, :) = points(ii-1,:) + [0.8 0.04 0] + 0.5 * randn(1,3);
end

% Create the box we're interested in
x = linspace(-10,10);
y = x;
z = x;
[X,Y,Z] = meshgrid(x,y,z);

% Calculate the sum of the probability densities(ish)
V = zeros(size(X));
for ii = 1:10
    V = V + 1/(2*pi)^(3/2) * exp(-0.5 * (((X-points(ii,1)).^2 + (Y-points(ii,2)).^2 + (Z-points(ii,3)).^2)));
end

fv = isosurface(X,Y,Z,V, 1e-4 * 1/(2*pi)^(3/2), 'noshare');
fv2 = isosurface(X,Y,Z,V, 1e-5 * 1/(2*pi)^(3/2), 'noshare'); 
p = patch('vertices', fv.vertices, 'faces', fv.faces);
set(p,'facecolor', 'none', 'edgecolor', 'blue', 'FaceAlpha', 0.05)
hold on;
p2 = patch('vertices', fv2.vertices, 'faces', fv2.faces);
set(p2,'facecolor', 'none', 'edgecolor', 'red', 'FaceAlpha', 0.1)
scatter3(points(:,1), points(:,2), points(:,3));
于 2013-10-29T09:50:19.943 回答