Filter löschen
Filter löschen

Optimization using Cell Arrays

7 Ansichten (letzte 30 Tage)
DB
DB am 12 Jul. 2023
Kommentiert: Rik am 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 Kommentare
Torsten
Torsten am 12 Jul. 2023
Bearbeitet: Torsten am 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 am 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

Melden Sie sich an, um zu kommentieren.

Antworten (1)

Image Analyst
Image Analyst am 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 Kommentare
DB
DB am 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 am 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

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Loops and Conditional Statements finden Sie in Help Center und File Exchange

Tags

Produkte


Version

R2023a

Community Treasure Hunt

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

Start Hunting!

Translated by