Optimization using Cell Arrays
Show older comments
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
I wonder what you expect as result for Rinter from the operation
Rinter(r) = c1{1:336,1}(1:1000) + (r-r1{1:336,1}(1:1000)) / slope{1:336}(1:1000);
I suspect that you want to save 336000 values for each value of r(i) (i = 1,...,1080), but how should this be possible in one scalar value Rinter(r) ?
James Tursa
on 12 Jul 2023
You need to tell us exactly what r1, c1, and slope are (variable size and type etc.). A small example of inputs and desired output would also help.
DB
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}
DB
on 13 Jul 2023
Answers (1)
Image Analyst
on 12 Jul 2023
0 votes
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
Rik
on 13 Jul 2023
Adding to this: you seem under the impression that using cellfun will be faster than a loop. It will not. Only the legacy syntax (i.e. cellfun('prodofsize',___); etc.) are faster than a loop with a function call. cellfun and its friend only hide the loop, adding a bit of overhead while doing so.
DB
on 13 Jul 2023
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
Categories
Find more on Loops and Conditional Statements in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!