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

조회 수: 1 (최근 30일)
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.

채택된 답변

Walter Roberson
Walter Roberson 2019년 3월 18일
편집: Walter Roberson 2019년 3월 18일
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

추가 답변 (1개)

Steven Lord
Steven Lord 2019년 3월 18일
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.

카테고리

Help CenterFile Exchange에서 Logical에 대해 자세히 알아보기

태그

Community Treasure Hunt

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

Start Hunting!

Translated by