Ответ @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
каждый.
ПРЕДУПРЕЖДЕНИЕ:
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