Improving the efficiency of triple nested loop
5 views (last 30 days)
Show older comments
The code tests a 3D binary array for the largest sphere that can fit into the porous regions. The code works however for a 40x40x40 array for a triple nested loop, the code runs slowly. I was wondering if there were a way that it could be rewritten as to not take so long. An initial idea was not using interp3 every single iteration but I was not sure how to write that.
function poresize=poresizeAlgorithm(tiff,scaffoldLength)
tiffInv=~tiff;
j=size(tiff,1);
k=size(tiff,2);
l=size(tiff,3);
[x,y,z] = meshgrid([1:j],[1:k],[1:l]);
[x1,y1,z1] = meshgrid([1:j],[1:k],[1:l]);
r=0.5;
position=[];
for m=1+ceil(r):size(tiffInv,1)-ceil(r)
for n=1+ceil(r):size(tiffInv,2)-ceil(r)
for o=1+ceil(r):size(tiffInv,3)-ceil(r)
centreSphere=tiffInv(m,n,o);
if centreSphere==1
%add sphere to array
equ = ((x-m).^2 + (y-n).^2 + (z-o).^2)./(r.^2);
z11 = interp3(x,y,z,equ,x1,y1,z1,'nearest'); %was spline
ix = 1 > z11;
volSphere=sum(ix,'all');
testSphere=ix+tiffInv;
numTwo=sum(testSphere(:) == 2);
if volSphere==numTwo
output=[m,n,o,r];
position=[position output];
r=r+0.25;
position2=[reshape(position,4,[])]';
continue
end
end
end
end
end
poresize=(scaffoldLength/j) * (position2(end,4)*2);
end
5 Comments
Dyuman Joshi
on 29 Dec 2023
What is the objective/idea behind the interp3 line?
If you can provide additional details regarding what you are trying to do, we might be able to offer more suggestions.
See Also
Categories
Find more on Surface and Mesh Plots 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!