如何将仿射变换(4x4矩阵)应用于ndgrid / meshgrid结果?

时间:2014-03-04 14:40:07

标签: matlab matrix geometry affinetransform

M是仿射变换矩阵,可以将坐标从一个坐标系转换为另一个坐标系,如下所示:

v_old = [ x_old y_old z_old 1];
v_new = M * v_old;
% v_new contains [ x_new y_new z_new 1 ]

现在,我已经获得了ndgrid / meshgrid形式的坐标:

[ X_old Y_old Z_old ] = ndgrid( 0:15 ); % for instance

如何将这些转换为X_new等?

我可以使用三个for循环循环(X_old(i,j,k)对应上面的x_old),但必须有更好的解决方案。

1 个答案:

答案 0 :(得分:2)

您只需重新排列值,以便每个点在一行中有四个坐标:

result = [X_old(:) Y_old(:) Z_old(:) ones(numel(X_old),1)] * M;

result的每一行都给出了每个点的新坐标。

请注意,这是有效的,因为将矩阵A乘以矩阵B与乘以AB的每一行相同。

或者,如果您无法承担构建上述矩阵(由于内存限制),请使用

result = X_old(:)*M(1,:) + Y_old(:)*M(2,:) + Z_old(:)*M(3,:) + ones(numel(X_old),1)*M(4,:);

在任何一种情况下,如果您要重新排列结果,使其与X_oldY_oldZ_old的大小相同,请将此作为最后一步:

s = size(X_old);
X_new = reshape(result(:,1), s);
Y_new = reshape(result(:,2), s);
Z_new = reshape(result(:,3), s);
相关问题