multiplication of matrix with long data

1 次查看(过去 30 天)
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 个评论
Bruno Luong
Bruno Luong 2022-7-14
"So far, I'm doing a for loop, which is not a Matlab way. "
Anything allowed by MATLAB IS MATLAB way.
Steven Lord
Steven Lord 2023-2-28
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.

请先登录,再进行评论。

采纳的回答

Bruno Luong
Bruno Luong 2022-7-14
编辑:Bruno Luong 2022-7-14
% 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)
xyz =
xyz(:,:,1) = 0.3128 0.5127 -0.3960 xyz(:,:,2) = -0.7072 -0.7636 0.1150 xyz(:,:,3) = -0.1876 0.0750 1.0194 xyz(:,:,4) = 1.2058 -0.6237 0.2521
% For older MATLAB
%XYZ = [X, Y, Z];
%xyz = sum(T.*XYZ,2)
  7 个评论
michael
michael 2023-2-28
Please note that I'm using old version Matlab R14
Bruno Luong
Bruno Luong 2023-2-28
编辑:Bruno Luong 2023-2-28
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)

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Programming 的更多信息

产品


版本

R14SP2

Community Treasure Hunt

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

Start Hunting!

Translated by