旋转高斯函数 - matlab

Rotating a gaussian function - matlab

美好的一天,

我有这样的代码可以拉伸和旋转高斯二维 pdf:

mu = [0 0];

Sigma = [1 0; 0 1];
Scale = [3 0; 0 1];
Theta = 10;
Rotate = [cosd(Theta) -sind(Theta); sind(Theta) cosd(Theta)];
Sigma = (Sigma*Scale)*Rotate

x1 = -100:1:100; x2 = -100:1:100;
[X1,X2] = meshgrid(x1,x2);
F = mvnpdf([X1(:) X2(:)],mu,Sigma);
F = reshape(F,length(x2),length(x1));

imshow(F*255)

不幸的是,当我将 Theta 更改为 0 以外的值时,它说 SIGMA 必须是方形、对称、正定矩阵。我能知道这是怎么回事吗

我看到您正在尝试旋转 2D 中的方差...由于 "sigma" 矩阵本质上是一个张量,因此您必须在它的两侧都用变换来击中 sigma 矩阵。

mu = [0 0];

Sigma = [1 0; 0 1];
Scale = [10 0;0 1];
Theta = pi/3;
m = makehgtform('zrotate',Theta);
m = m(1:2,1:2);
Sigma = m*(Sigma*Scale)*m.';

x1 = -100:1:100; 
x2 = -100:1:100;
[X1,X2] = meshgrid(x1,x2);
F = mvnpdf([X1(:) X2(:)],mu,Sigma);
F = reshape(F,length(x2),length(x1));

imshow(F*255)

如果您查阅维基百科上有关高斯二维 PDF 的一般椭圆版本的文章,您似乎没有正确旋转它。一般来说,等式是:

来源:Wikipedia

其中:

通常,A = 1,我们将在此处采用。角度 theta 将旋转 PDF counter-clockwise,因此我们可以在 mvnpdf 上使用方程的这种原始形式。使用您的定义和常量,它会变成这样:

x1 = -100:1:100; x2 = -100:1:100;
[X1,X2] = meshgrid(X1, X2);
sigma1 = 1;
sigma2 = 1;
scale1 = 3;
scale2 = 1;
sigma1 = scale1*sigma1;
sigma2 = scale2*sigma2;
Theta = 10;

a = ((cosd(Theta)^2) / (2*sigma1^2)) + ((sind(Theta)^2) / (2*sigma2^2));
b = -((sind(2*Theta)) / (4*sigma1^2)) + ((sind(2*Theta)) / (4*sigma2^2));
c = ((sind(Theta)^2) / (2*sigma1^2)) + ((cosd(Theta)^2) / (2*sigma2^2));

mu = [0 0];
A = 1;
F = A*exp(-(a*(X1 - mu(1)).^2 + 2*b*(X1 - mu(1)).*(X2 - mu(2)) + c*(X2 - mu(2)).^2));
imshow(F*255);