Filter löschen
Filter löschen

Conversion function taking a very long time to run in loop, anyway to improve?

1 Ansicht (letzte 30 Tage)
I created a function that does a simple conversion to my data with two coordinates being the input (below)
%%
function [ GazeDirDegrees ] = ConvertGazeDir( GazeDir1,GazeDir2 )
GazeDirDegrees = 180*asin(GazeDir1/sqrt(GazeDir1.^2+GazeDir2.^2))/pi
end
I am running this in a loop over 120 cells, with each cell containing 1000-1700 data points. As you can imagine this means that the function has to be called over 120,000 times. Not only that, but I have to run this loop 4 times for 4 different variables. (below is an example for just one variable))
%%
for i = 1:length(LeftGazeDirX)
for b = 1:length(FilteredLeftGazeDirX{1,i})
ConvLeftGazeDirX{b,i} = ConvertGazeDir(FilteredLeftGazeDirX{1,i}(b,1),FilteredLeftGazeDirZ{1,i}(b,1))
end
end
Not sure if there is anything I can do to make this run more efficiently, as it currently takes about 20 seconds for a single cells worth of data.

Akzeptierte Antwort

Walter Roberson
Walter Roberson am 18 Mär. 2019
Bearbeitet: Walter Roberson am 18 Mär. 2019
Vectorize your formula by replacing the / with ./ and then you can pass in entire cells (provided the two cells are the same size)
Also you can improve performance slightly by making it 180/pi * .... instead of 180*.../pi so that the division by pi only has to be done once
Also consider using asind without the 180/pi

Weitere Antworten (1)

Steven Lord
Steven Lord am 18 Mär. 2019
Call asind on arrays of data instead of on scalars. Use the hypot function if your data is real.
n = 100;
X = rand(n);
Y = rand(n);
tic
Z = asind(X./hypot(X, Y));
toc
tic
Z2 = asind(X./sqrt(X.^2+Y.^2));
toc
differenceBetweenApproaches = norm(Z-Z2)
The difference between the two approaches should be small.

Tags

Community Treasure Hunt

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

Start Hunting!

Translated by