Имена версий приложений

Ответ @rayryeng правильный, учитывая, что у вас есть набор до 3 точек в пространстве 3-dimensional. Если вам нужно преобразовать m точки в пространстве n-dimensional (m>n), вам сначала нужно добавить m-n координаты к этим m точкам, чтобы они существовали в пространстве m-dimensional (т.е. a ] в @rayryeng становится квадратной матрицей) ... Тогда процедура, описываемая @rayryeng, даст вам точное преобразование точек, тогда вам просто нужно выбрать только координаты преобразованных точек в исходном пространстве n-dimensional.

В качестве примера скажем, что вы хотите преобразовать точки:

(2 -2 2) -> (-3 5 -4)
(2 3 0) -> (3 4 4)
(-4 -2 5) -> (-4 -1 -2)
(-3 4 1) -> (4 0 5)
(5 -4 0) -> (-3 -2 -3)

Обратите внимание, что у вас есть m=5 точки, которые n=3 -мерны. Поэтому вам нужно добавить координаты в эти точки, чтобы они были n=m=5 -мерными, а затем применили процедуру, описанную @rayryeng.

Я реализовал функцию, которая делает это (найти ее ниже). Вам просто нужно организовать такие точки, чтобы каждая из исходных точек была столбцом в матрице u, и каждая из целевых точек является столбцом в матрице v. Матрицы u и v будут, таким образом, 3 на 5 каждый.

ПРЕДУПРЕЖДЕНИЕ:

  • матрица A в функции может потребоваться МНОГО памяти для умеренно большого количества точек nP, поскольку у него есть nP^4 элементы.
  • Чтобы преодолеть это, для квадратных матриц u и v вы можете просто использовать T=v*inv(u) или T=v/u в нотации MATLAB.
  • Код может работать очень медленно ...

В MATLAB:

u = [2 2 -4 -3 5;-2 3 -2 4 -4;2 0 5 1 0]; % setting the set of source points
v = [-3 3 -4 4 -3;5 4 -1 0 -2;-4 4 -2 5 -3]; % setting the set of target points
T = findLinearTransformation(u,v); % calculating the transformation

Вы может проверить, что T является правильным:

I = eye(5);
uu = [u;I((3+1):5,1:5)]; % filling-up the matrix of source points so that you have 5-d points
w = T*uu; % calculating target points
w = w(1:3,1:5); % recovering the 3-d points
w - v % w should match v ... notice that the error between w and v is really small

Функция, которая вычисляет матрицу преобразования:

function [T,A] = findLinearTransformation(u,v)
% finds a matrix T (nP X nP) such that T * u(:,i) = v(:,i)
% u(:,i) and v(:,i) are n-dim col vectors; the amount of col vectors in u and v must match (and are equal to nP)
%
    if any(size(u) ~= size(v))
        error('findLinearTransform:u','u and v must be the same shape and size n-dim vectors');
    end
    [n,nP] = size(u); % n -> dimensionality; nP -> number of points to be transformed
    if nP > n % if the number of points to be transform exceeds the dimensionality of points
        I = eye(nP);
        u = [u;I((n+1):nP,1:nP)]; % then fill up the points to be transformed with the identity matrix
        v = [v;I((n+1):nP,1:nP)]; % as well as the transformed points
        [n,nP] = size(u);
    end
    A = zeros(nP*n,n*n);
    for k = 1:nP
        for i = ((k-1)*n+1):(k*n)
            A(i,mod((((i-1)*n+1):(i*n))-1,n*n) + 1) = u(:,k)';
        end
    end
    v = v(:);
    T = reshape(A\v, n, n).';
end
-3
задан SRIARAVIND VADUGANATHASAMY 13 July 2018 в 14:51
поделиться