Matlab中2D高斯绘制疑问:双1D高斯乘积为何得到平面
问题原因与解决方法
你的问题出在维度不匹配以及对“两个1D高斯乘积”的实现方式错误上,以下是具体分析和修正方案:
你可能犯的错误写法
大概率是直接用一维的x/y数组计算1D高斯后相乘,比如:
x=0:.02:1; y=x; r = 0.2; [X,Y]=meshgrid(x,y); % 错误:用一维数组计算,得到的结果无法生成曲面 gauss_x = exp(-(x-0.5).^2/(2*r^2)); gauss_y = exp(-(y-0.5).^2/(2*r^2)); Z = gauss_x * gauss_y; % 向量点乘得到标量,mesh后呈现平面
这种写法中,gauss_x和gauss_y是一维数组,用*相乘会得到标量结果,整个Z矩阵被填充为同一个值,自然显示为平面。
正确的实现方式
2D高斯分解为两个1D高斯的乘积,指的是每个网格点上的x方向高斯值乘以对应y方向的高斯值,需要基于meshgrid生成的二维矩阵X和Y来计算:
x=0:.02:1; y=x; r = 0.2; [X,Y]=meshgrid(x,y); % 基于二维矩阵计算x、y方向的1D高斯 gauss_x = exp(-(X-0.5).^2/(2*r^2)); gauss_y = exp(-(Y-0.5).^2/(2*r^2)); Z = gauss_x .* gauss_y; % 逐元素相乘,得到每个网格点的2D高斯值 mesh(X,Y,Z) colormap([0 0 0]);
核心原理
meshgrid生成的X是每行都等于x的二维矩阵,Y是每列都等于y的二维矩阵。针对X计算的gauss_x,每个元素对应该网格点x坐标的1D高斯值;同理gauss_y对应y坐标的1D高斯值。用逐元素乘法.*相乘后,每个网格点的值就是两个1D高斯的乘积,最终得到和原代码完全一致的高斯曲面。
内容的提问来源于stack exchange,提问作者sharon shen
相关产品推荐
相关产品推荐

