multiplication of matrix with long data
1 view (last 30 days)
Show older comments
Hi,
I have a long data (200K+ samples) from which a location vector L (3x1) and a matrix T (euler matrix 3x3) is generated and multiplied l = TL.
On the results of l (3x1) there are operations of sin and atan (to get the required results).
So far, I'm doing a for loop, which is not a Matlab way.
I'd like to speedup the performance of the code.
How can I do it?
4 Comments
Bruno Luong
on 14 Jul 2022
"So far, I'm doing a for loop, which is not a Matlab way. "
Anything allowed by MATLAB IS MATLAB way.
Steven Lord
on 28 Feb 2023
Is there a specific reason you're still using release R14SP2 which is pretty close to twenty years old at this point?
There have been a lot of improvements in MATLAB in the past twenty years, which likely would improve performance of your code.
Accepted Answer
Bruno Luong
on 14 Jul 2022
Edited: Bruno Luong
on 14 Jul 2022
% Test data
N = 4;
Phi = 2*pi*rand(1,N);
Theta = 2*pi*rand(1,N);
Psi = 2*pi*rand(1,N);
X = rand(1,N);
Y = rand(1,N);
Z = rand(1,N);
Phi = reshape(Phi, 1, 1, []);
Theta = reshape(Theta, 1, 1, []);
Psi = reshape(Psi, 1, 1, []);
X = reshape(X, 1, 1, []);
Y = reshape(Y, 1, 1, []);
Z = reshape(Z, 1, 1, []);
sB = sin(Phi); cB = cos(Phi);
sD = sin(Theta); cD = cos(Theta);
sE = sin(Psi); cE = cos(Psi);
T = [ cD.*cE, -cB.*sE+cE.*sB.*sD, sB.*sE+cB.*sD.*cE;
cD.*sE, cB.*cE+sB.*sD.*sE, -cE.*sB+cB.*sD.*sE;
-sD, sB.*cD, cB.*cD ];
XYZ = [X; Y; Z];
xyz = pagemtimes(T, XYZ)
% For older MATLAB
%XYZ = [X, Y, Z];
%xyz = sum(T.*XYZ,2)
7 Comments
Bruno Luong
on 28 Feb 2023
Edited: Bruno Luong
on 28 Feb 2023
The inverse of T is its transpose T.', you need to form the inverse, noted here by iT
iT = [ cD.*cE, cD.*sE, -sD;
-cB.*sE+cE.*sB.*sD, cB.*cE+sB.*sD.*sE, sB.*cD;
sB.*sE+cB.*sD.*cE, cE.*sB+cB.*sD.*sE, cB.*cD ];
% For older MATLAB
XYZ = [X, Y, Z];
xyz = sum(iT.*XYZ,2)
More Answers (0)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!