【问题标题】:How to apply an affine transformation (4x4 matrix) to ndgrid/meshgrid results?如何将仿射变换(4x4 矩阵)应用于 ndgrid/meshgrid 结果?
【发布时间】:2014-03-04 14:40:07
【问题描述】:

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)但必须有更好的解决方案。

【问题讨论】:

    标签: matlab matrix geometry affinetransform


    【解决方案1】:

    您只需重新排列这些值,使每个点的四个坐标在一行中:

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

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

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

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

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

    在任何一种情况下,如果您想重新排列结果,使其具有与X_old、Y_old、Z_old 相同的大小,请将其用作最后一步:

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

    【讨论】:

    • 整洁!不过,我有一个非常大的矩阵(X_old 是 512x512x300),所以当我仍然得到 ndgrid 结果时,我无法创建该矩阵。
    • (“负担”如“保留在内存中”)
    • @Anna 在这种情况下,您可能需要一个循环来构建矩阵的每一行:result(ii,:) = [X_old(ii) Y_old(ii) Z_old(ii) 1] * M; 其中ii 是循环变量(从1 到numel(X))。或者分块构建矩阵,每个块使用尽可能多的行
    • @Anna 我想我找到了办法。请查看更新的答案
    • 啊,M 必须转置。谢谢!
    猜你喜欢
    • 2011-02-07
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多