Optimization using Cell Arrays

7 次查看(过去 30 天)
DB
DB 2023-7-12
评论: Rik 2023-7-13
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 个评论
Torsten
Torsten 2023-7-12
编辑:Torsten 2023-7-12
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 2023-7-13
@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

请先登录,再进行评论。

回答(1 个)

Image Analyst
Image Analyst 2023-7-12
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 个评论
DB
DB 2023-7-13
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 2023-7-13
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

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Loops and Conditional Statements 的更多信息

标签

产品


版本

R2023a

Community Treasure Hunt

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

Start Hunting!

Translated by