2017-05-03 2 views
0

J'ai un ensemble de données composé de coordonnées x, y et z que je trace pour créer une ligne 3D. Je veux effectuer une analyse de Procrustes pour trouver la similitude entre la forme de cette ligne 3D et une autre forme par défaut. Lorsque j'essaie d'utiliser des fonctions d'analyse de forme ou des fonctions Procrustes, cela me donne une erreur de handle invalide sur l'entrée de tracé 3D que j'ai créée pour la contenir, c'est-à-dire 'myLine'. Comment puis-je convertir ce tracé de coordonnées 3D en un objet utilisable pour Procrustes ou une autre fonction?Comment créer un objet de ligne 3D dans MatLab à partir des coordonnées xyz afin qu'il soit utilisable dans une analyse Procrustes?

3D line created from the coordinates in code below.

myLine = plot3(GPS(:,8),GPS(:,9),GPS(:,10))

est inférieure à la fonction d'analyse de la forme que je suis en train de travailler avec

function [f,g]=ShapeAnalysis(f,g) 
% SHAPEANALYSIS(F,G) Plots the parameterised curves before and after 
% each stage of translating, scaling and aligning. Outputs are 
% parameterised curves ready for Procustes shape analysis. 

LW = 'LineWidth'; FS = 'FontSize'; 
% Plot orignal 
subplot(2,2,1) 
plot(f,'r',LW,2), hold on, axis equal, plot(g,'k',LW,2) 
title('Orignal',FS,16) 

% Translate mean to 0. 
f = f-mean(f); g = g-mean(g); 
subplot(2,2,2) 
plot(f,'r',LW,2), hold on, axis equal, plot(g,'k',LW,2) 
title('After translation',FS,16) 

% Scale so RMSD is 1. 
f = f/norm(f); g = g/norm(g); 
subplot(2,2,3) 
plot(f,'r',LW,2), hold on, axis equal, plot(g,'k',LW,2) 
title('After scaling',FS,16) 

% Align major axis. 
subplot(2,2,4) 
% Find argument of major axis. 
[~,fxmax]=max(abs(f)); [~,gxmax]=max(abs(g)); 
rotf=angle(f(fxmax)); rotg=angle(g(gxmax)); 
% Rotate both so major axis lies on the +ve real axis. 
x = chebfun('x',[0,2*pi]); 
f = exp(-1i*rotf)*f(mod(x+fxmax,2*pi)); 
g = exp(-1i*rotg)*g(mod(x+gxmax,2*pi)); 
plot(f,'r',LW,2), hold on, axis equal, plot(g,'k',LW,2) 
title('After aligning',FS,16), hold off 

end 

edit: Je suppose que d'une façon plus facile de le mettre est comment puis-je faire référence à la ligne créé avec une variable telle que si j'écris 'plot (myLine)', où myLine = la ligne créée par plot3 (GPS (:, 8), ...), il créera la même ligne. De cette façon, je peux passer la variable une à une fonction de comparaison. (pour être clair, je n'ai pas de problème avec la représentation graphique de la ligne, je la manipule uniquement avec une référence aux coordonnées et aucune équation de ligne)

edit: J'essaie de faire passer myLine dans l'analyse de forme, avec équation pour un cercle pour comparer à quel point myLine est à la deuxième entrée. Alors j'entre:

>>myLine = plot3(GPS(:,8),GPS(:,9),GPS(:,10)) 
>>ShapeAnalysis(myLine,circle(0,0,1)) 

Après avoir entré, je reçois l'erreur suivante:

Error using plot 
Invalid handle. 

Error in ShapeAnalysis (line 9) 
    plot(f,'r',LW,2), hold on, axis equal, plot(g,'k',LW,2) 

J'espère que cela efface ma question un peu.

Répondre

0

Vous avez presque répondu à votre question: "Comment puis-je convertir ce tracé de coordonnées 3D en un objet utilisable ...?" Comme tout objet, vous avez besoin d'une référence à la manipulation pour:

myLine = plot3(GPS(:,8),GPS(:,9),GPS(:,10)) 

Vous pouvez maintenant passer autour myLine et voir ce que vous pouvez faire avec lui.

+0

Malheureusement cela ne fonctionne pas pour moi. Il me donne une erreur de handle invalide lorsque j'essaie d'utiliser cette méthode. Est-ce une erreur de ma part? J'utilise la fonction que j'ai fournie et je passe 'myLine' avec une autre ligne, mais cela donne l'erreur de poignée que j'ai mentionnée dans la question. –

+0

En fonction de votre modification - Lorsque vous souhaitez remplacer votre ligne, vous devez lui donner les propriétés que vous recherchez. Par exemple, "myLine" a XData, YData, et ZData qui est ce que vous voulez tracer. En fonction de la version de Matlab avec laquelle vous travaillez, vous pouvez utiliser: plot3 (myLine.XData, myLine.YData, myLine.ZData) ou plot3 (get (myLine, 'XData'), get (monLigne, 'YData '), get (myLine,' ZData ')). Regardez dans OOP si vous êtes confus à ce sujet. (https://www.mathworks.com/help/matlab/object-oriented-programming.html) –

+0

Je peux me replacer parfaitement maintenant, j'ai juste besoin de comprendre comment obtenir un objet que la fonction ci-dessus va accepter. Ai-je besoin de le convertir en une équation de la ligne? –