How can I improve this line of code perfomance wise?

7 views (last 30 days)
lit
lit on 8 Aug 2023
Answered: Karan Singh on 1 Feb 2025 at 11:26
When using the profiler to look at the performance of a function I need to work with, I saw that one line takes up much time
invalidIndex = any((coords<ddims(1:3)) | (coords>ddims(4:6)),2);
So it just checks if the point contained are within the bounds. The size of coords is nx3
Is there any way this line can be improved perfomance wise. I couldn't think of anything else...
  2 Comments
Walter Roberson
Walter Roberson on 8 Aug 2023
You could try unvectorizing it and seeing how much difference that makes:
invalidIndex = coords(:,1)<ddims(1) | coords(:,2)<ddims(2) | coords(:,3)<ddims(3) | coords(:,1)>ddims(4) | coords(:,2)>ddims(5) | coords(:,3)>ddims(6);
My expectation is that this would be notably slower... but that you would have to measure the timing to be sure.
lit
lit on 8 Aug 2023
actually, it does improve performance, so thank you very much!

Sign in to comment.

Answers (1)

Karan Singh
Karan Singh on 1 Feb 2025 at 11:26
Hi @lit,
In addition to what Walter stated, you can slo try to precompute bounds to avoid repested indexing.
In the original code, every time the condition (coords < ddims(1:3)) | (coords > ddims(4:6)) runs:
  1. ddims(1:3) and ddims(4:6) are accessed twice (one for < and one for >).
  2. MATLAB performs indexing operations multiple times, which can be slow for large datasets.
lowerBounds = ddims(1:3);
upperBounds = ddims(4:6);
invalidIndex = (coords(:,1) < lowerBounds(1)) | (coords(:,1) > upperBounds(1)) | ...
(coords(:,2) < lowerBounds(2)) | (coords(:,2) > upperBounds(2)) | ...
(coords(:,3) < lowerBounds(3)) | (coords(:,3) > upperBounds(3));

Products


Release

R2019b

Community Treasure Hunt

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

Start Hunting!