Optimization using Cell Arrays

4 vues (au cours des 30 derniers jours)
DB
DB le 12 Juil 2023
Commenté : Rik le 13 Juil 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 commentaires
Torsten
Torsten le 12 Juil 2023
Modifié(e) : Torsten le 12 Juil 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 le 13 Juil 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

Connectez-vous pour commenter.

Réponses (1)

Image Analyst
Image Analyst le 12 Juil 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 commentaires
DB
DB le 13 Juil 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 le 13 Juil 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

Connectez-vous pour commenter.

Catégories

En savoir plus sur Loops and Conditional Statements dans Help Center et File Exchange

Tags

Produits


Version

R2023a

Community Treasure Hunt

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

Start Hunting!

Translated by