旋转高斯函数 - 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);
美好的一天,
我有这样的代码可以拉伸和旋转高斯二维 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);