Vectorized Solution to Rotate Multiple Points each at a Different Angle
13 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
John deGrassie
am 7 Mär. 2013
Kommentiert: Fvieira
am 30 Apr. 2021
I want to rotate a matrix of points, i.e. column vectors. However, I want to rotate each vector in the matrix by a different angle. For example:
pointMatrix = [v1,v2,v3,v4]; %vi is a column vector
rotateAngles = [10,20,30,40]; %degrees
Say I want to rotate these points around the z-axis. Therefore, for one point I could do something like the following:
Rz = [[cos(rotateAngles(1)) -sin(rotateAngles(1)) 0];...
[sin(rotateAngles(1)) cos(rotateAngles(1)) 0];...
[ 0 0 1]];
v1Rotated = Rz*v1;
Is there a non-loop way to rotate all the vectors in my pointMatrix by each one's unique rotation angle? Something like this...
allRotatedPoints = superRotationMatrix*pointMatrix;
where the superRotationMatrix "magically" rotates each column by the corresponding angle.
Thanks!
0 Kommentare
Akzeptierte Antwort
Teja Muppirala
am 8 Mär. 2013
Bearbeitet: Teja Muppirala
am 8 Mär. 2013
This vectorized solution uses complex exponentials and works about 2 orders of magnitude faster for large vectors.
M = exp(rotateAngles*1i) .* ([1 1i 0]*pointMatrix);
allRotatedPoints = [real(M); imag(M); pointMatrix(3,:)];
1 Kommentar
Fvieira
am 30 Apr. 2021
Notice that this works for 3 coordinate vectors (p = x,y,z).
For 2d one must consider this variation:
M = exp(rotateAngles*1i) .* ([1 1i]*pointMatrix);
allRotatedPoints = [real(M); imag(M)].'
Here is a full example that I did based on Muppirala's answer regarding some small details (angle in radians, for example):
v1 = [1;1]; v2 = [2;2]; v3 = [3;0]; v4 = [4;2];
pointMatrix = [v1 v2 v3 v4] %vi is a column vector
rotateAngles = [90 90 90 90] *pi/180 % radians
M = exp(rotateAngles*1i) .* ([1 1i]*pointMatrix);
allRotatedPoints = [real(M); imag(M)].'
pointMatrix = pointMatrix.'
figure(1)
plot(pointMatrix(:,1),pointMatrix(:,2),'o')
axis([-5 5 -5 5])
grid on, hold on
plot(allRotatedPoints(:,1),allRotatedPoints(:,2),'x')
Here are the plots: Circles are the points, crosses are them rotated by 90 degrees.
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/602480/image.jpeg)
Weitere Antworten (1)
Siehe auch
Kategorien
Mehr zu Surface and Mesh Plots finden Sie in Help Center und File Exchange
Produkte
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!