Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Methods to speed up for loop in MATLAB

I have just profiled my MATLAB code and there is a bottle-neck in this for loop:

for vert=-down:up
    for horz=-lhs:rhs
        y = y + x(k+vert.*length+horz).*DM(abs(vert).*nu+abs(horz)+1);
    end
end

where y, x and DM are vectors I have already defined. I vectorised the loop by writing,

B=(-down:up)'*ones(1,lhs+rhs+1);
C=ones(up+down+1,1)*(-lhs:rhs);
y = sum(sum(x(k+length.*B+C).*DM(abs(B).*nu+abs(C)+1)));

But this ended up being sufficiently slower.

Are there any suggestions on how I can speed up this for loop?

Thanks in advance.

like image 437
alext87 Avatar asked Nov 21 '25 07:11

alext87


1 Answers

What you've done is not really vectorization. It's very difficult, if not impossible, to write proper vectorization procedures for image processing (I assume that's what you're doing) in Matlab. When we use the term vectorized, we really mean "vectorized with no additional computation". For example, this code

a = 1:1000000;
for i = a
    n = n+i;
end

would run much slower then this code

a = 1:1000000;
sum(a)

Update: code above has been modified, thanks to @Rasman's keen suggestion. The reason is that Matlab does not compile your code into machine language before running it, and that's what causes it to be slower. Built-in functions like sum, mean and the .* operator run pre-compiled C code behind the scenes. For loops are a great example of code that runs slowly when not optimized for you CPU's registers.

What you have done, and please ignore my first comment, is rewriting your procedure with a vector operation and some additional operations. Those are the operations that take extra CPU simply because you're telling your computer to do more computations, even though each computation separately may (or may not) take less time.

If you are really after speeding up you code, take a look at MEX files. They allow you to write and compile C and C++ code, compile it and run as Matlab functions, just like those fast built-in ones. In any case, Matlab is not meant to be a fast general-purpose programming platform, but rather a computer simulation environment, though this approach has been changing in the recent years. My advise (from experience) is that if you do image processing, you will write for loops, and there's rarely a way around it. Vector operations were written for a more intuitive approach to linear algebra problems, and we rarely treat digital images as regular rectangular matrices in terms of what we do with them.

I hope this helps.

like image 97
Phonon Avatar answered Nov 24 '25 04:11

Phonon



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!