-2

我正在尝试通过将旋转矩阵应用于 X,Y 坐标,然后在 matlab 中将其绘制为网格来旋转高斯的导数(或就此而言的原始高斯),但我遇到了一个问题绘图每次只会旋转 90 度,对于所有 n*pi 点,根本没有网格出现。我想知道我做错了什么,希望有人能发现我的错误。我对matlab还很陌生,所以如果代码不漂亮,请原谅我。谢谢!

这是我拥有的代码:

sigma = 4;
[x,y] = deal(-3*sigma:.5:3*sigma);
[X,Y] = meshgrid(x,y);
B = [transpose(x) transpose(y)];

for i=1:1:16
figure(i);
theta = i*pi/8;
rotation = [cos(theta) sin(theta); -sin(theta) cos(theta)];
A = B * rotation;
[x_new, y_new] = meshgrid(A(:,1)', A(:,2)');
mesh(x_new, y_new, dgauss_x(x_new, y_new, sigma));
end

function f = dgauss_x(x, y, sigma)
%first order derivative of Gaussian
f = -x .* gaussian(x, y, sigma) ./ sigma^2;

function f = gaussian(x, y, sigma)
f = exp(-(x .^ 2 + y .^ 2)/(2*sigma^2)) / (sqrt(2*pi*(sigma^2)));
4

1 回答 1

0

我想通了。这是一个愚蠢的错误。基本上我必须为 X 和 Y 创建一个网格,将其重塑为 X 和 Y 的 Nx2 矩阵。应用旋转矩阵,然后重新整形并应用高斯。代码如下(可以清理):

for i=1:1:16
figure(i);
theta = i*pi/8;
rotation = [cos(theta) -sin(theta); sin(theta) cos(theta)];
X1 = reshape(X, length(x)*length(x), 1);
Y1 = reshape(Y, length(y)*length(y), 1);
B2 = [X1 Y1];
A = B2 * rotation;
X1 = A(:,1);
X1 = reshape(X1, length(x), length(x));
Y1 = A(:,2);
Y1 = reshape(Y1, length(y), length(y));
mesh(X1, Y1, dgauss_x(X1, Y1, sigma));
end
于 2013-10-25T14:44:19.443 回答