identify a factor that links two equal matrices but positioned in different places on the same plane

1 vue (au cours des 30 derniers jours)
I have two matrices ('RC_matlab' and 'RC_trasl') representing the same 2D coordinates of nodes on the same plane but at different plane positions.
I would like to identify the factor(s) that links the 'RC_trasl' matrix to the 'RC_matlab' matrix. That is, transform 'RC_trasl' as 'RC_matlab'.
I tried to determine the centroid (with a function found among the answers in the forum) of the two matrices in order to obtain dX and dY but this is not the correct way (apparently).
load RC_matlab.mat
load RC_trasl.mat
% polygoncentroid
[xc_matlab,yc_matlab] = polygoncentroid(RC_matlab(:,1),RC_matlab(:,2));
[xc_trasl,yc_trasl] = polygoncentroid(RC_trasl(:,1),RC_trasl(:,2));
dX = xc_matlab - xc_trasl;
dY = yc_matlab - yc_trasl;
% Plot
figure
plot(RC_matlab(:,1),RC_matlab(:,2),'b.','Markersize',30);
hold on
plot(xc_matlab,yc_matlab,'k*','Markersize',10);
hold off
axis equal
figure
plot(RC_trasl(:,1),RC_trasl(:,2),'r.','Markersize',30);
hold on
plot(xc_trasl,yc_trasl,'k*','Markersize',10);
hold off
axis equal
% New matrix
R_trasl_new = dX + RC_trasl(:,1);
C_trasl_new = dY + RC_trasl(:,2);
RC_trasl_new = [R_trasl_new , C_trasl_new];
% ===== function
function [xc,yc] = polygoncentroid(x,y)
xn = circshift(x,-1);
yn = circshift(y,-1);
A = x.*yn-xn.*y;
a = 3*sum(A);
xc = sum((x+xn).*A)/a;
yc = sum((y+yn).*A)/a;
end

Réponse acceptée

Voss
Voss le 5 Oct 2023
Modifié(e) : Voss le 5 Oct 2023
load RC_matlab
load RC_trasl
% calculate the centroid of each set of points:
c_matlab = mean(RC_matlab,1);
c_trasl = mean(RC_trasl,1);
% calculate the offset of each point from its set's centroid:
d_matlab = RC_matlab-c_matlab;
d_trasl = RC_trasl-c_trasl;
% find the scale of the "matlab" set of points relative to the "trasl" set of points,
% by finding the mean ratio of the distances to their respective centroids:
scale_vector = sqrt(sum(d_matlab.^2,2))./sqrt(sum(d_trasl.^2,2));
scale = mean(scale_vector(scale_vector~=0 & isfinite(scale_vector)),1); % remove 0s, NaNs, and Infs, which can happen when a point is at the centroid
% then each can be (approximately) constructed from the other by a linear transformation:
RC_matlab_recon = (RC_trasl-c_trasl)*scale+c_matlab;
RC_trasl_recon = (RC_matlab-c_matlab)/scale+c_trasl;
% Plot
figure
plot(RC_matlab(:,1),RC_matlab(:,2),'b.','Markersize',30);
hold on
plot(RC_matlab_recon(:,1),RC_matlab_recon(:,2),'g*','Markersize',10);
hold off
axis equal
figure
plot(RC_trasl(:,1),RC_trasl(:,2),'r.','Markersize',30);
hold on
plot(RC_trasl_recon(:,1),RC_trasl_recon(:,2),'y*','Markersize',10);
hold off
axis equal
% check the max difference between the original and the reconstruction:
max(abs(RC_matlab-RC_matlab_recon),[],'all')
ans = 1.0281e-04
max(abs(RC_trasl-RC_trasl_recon),[],'all')
ans = 5.0200e-05
  4 commentaires
Alberto Acri
Alberto Acri le 17 Oct 2023
Déplacé(e) : Voss le 17 Oct 2023
Hi @Voss! I have a question for you, which was then the question of the post.
Is there a way to transform RC_transl into RC_matlab_recon? For example, a multiplicative parameter?
I would like to get something like this:
RC_matlab_recon = RC_transl*x;
Voss
Voss le 17 Oct 2023
"Is there a way to transform RC_transl into RC_matlab_recon?"
Yes, exactly as I said in my comment before (and demonstrated in my answer before that):
RC_matlab_recon = (RC_trasl-c_trasl)*scale+c_matlab;
You can't do it with only a scalar multiplicative parameter, but that expression includes a multiplicative parameter (scale). The expression is translating RC_trasl by its centroid (so that the points become centered at the origin), then applying the multiplicative factor (scale), then translating such that the centroid is the centroid of RC_matlab_recon (which is c_matlab).
You could do the same thing with a linear transformation matrix, and maybe that's what you have in mind. https://en.wikipedia.org/wiki/Transformation_matrix

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Resizing and Reshaping Matrices dans Help Center et File Exchange

Produits


Version

R2021b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by