Clear Filters
Clear Filters

Optimization using Cell Arrays

7 views (last 30 days)
DB
DB on 12 Jul 2023
Commented: Rik on 13 Jul 2023
Hello,
I'v been trying to optimize the existing code below. This calculation is done one at a time for 336000 of c1, r1, and slope.
Rinter = zeros(1080,1);
for r = 1:1080
Rinter(r) = c1 + (r-r1) / slope;
end
I redid the variables c1,r1,slope to be calculated all at once using cellfun. So now I have r1,c1,slope = 336 cell arrays with each cell holds 1000 values. I'm trying to figure out how to optimize the code so that:
Rinter = zeros(1080,1);
for r = 1:1080
Rinter(r) = c1{1:336,1}(1:1000) + (r-r1{1:336,1}(1:1000)) / slope{1:336}(1:1000);
end
any help is appreciated since I'm rather confused now. Thanks!
  5 Comments
Torsten
Torsten on 12 Jul 2023
Edited: Torsten on 12 Jul 2023
I don't understand your example. Since r is a scalar in your equation
Rinter(r) = c1{1:336,1}(1:1000) + (r-r1{1:336,1}(1:1000)) / slope{1:336}(1:1000);
shouldn't the components of the vector R = r*[1; 1; 1] be the same ?
r1{1,1} = ...
[538.066700563257
539.176467549361
537.641860711957];
c1{1,1} = ...
[145.906518570733
146.998492549802
145.488490220006];
slope{1,1} = ...
[-0.980866192253173
-0.989057988958667
-0.982385707846712];
Rinter{1,1} = ...
[693.449807150745
692.430300098817
691.410793046889];
R = (Rinter{1,1}-c1{1,1}).*slope{1,1}+r1{1,1}
R = 3×1
1.0000 -0.2872 1.3356
DB
DB on 13 Jul 2023
@Torsten, for every R(i) -> i=1:1080, I'm calculating:
for r = 1:1080
Rinter(r) = c1 + (r-r1) / slope;
end
However, my c1, r1, and slope are now cell arrays of 336 cells with 1000 in each of the cell.
Above calculation of R(1:3) using c1,r1,slope {1,1}(1) are correct:
Rinter(1) = 145.906518570733 + (1 - 538.066700563257)/-0.980866192253173; --> 693.4498
Rinter(2) = 145.906518570733 + (2 - 538.066700563257)/-0.980866192253173; --> 692.4303
Rinter(3) = 145.906518570733 + (3 - 538.066700563257)/-0.980866192253173; --> 691.4108

Sign in to comment.

Answers (1)

Image Analyst
Image Analyst on 12 Jul 2023
Just use a normal double array. Cell arrays are slow and very inefficient and are a special type of variable for situations where every element (cell) might have a different type or different number of elements in each cell. See the FAQ:
Since that does not apply in your situation, a normal double array would be the best, fastest, and most efficient approach.
  3 Comments
DB
DB on 13 Jul 2023
it is faster to calculate a lot of variables at once using arrayfun and cellfun instead of foor loop. For example:
tic
[r2A,c2A] = arrayfun(@(x,y) RPD(x,y,angle),r2,c2,'un', 0);
toc
tic
Elapsed time is 0.001386 seconds.
for i = 1:336
[r2l(i),c2l(i)] = RPD(r2(i),c2(i),angle);
end
toc
Elapsed time is 0.012329 seconds.
@Image Analyst However, the results of using arrayfun will be cell arrays instead of normal double array. Will converting them before and after calculations be efficient? I'm trying to simplify the code (performance speed and less lines of code).
Rik
Rik on 13 Jul 2023
You should use timeit when dealing with code that takes less than a second. You should also properly preallocate the output arrays.
r2l = zeros(1,336);
c2l = zeros(1,336);
for i = 1:336
[r2l(i),c2l(i)] = RPD(r2(i),c2(i),angle);
end

Sign in to comment.

Categories

Find more on Loops and Conditional Statements in Help Center and File Exchange

Tags

Products


Release

R2023a

Community Treasure Hunt

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

Start Hunting!