How to do this more efficiently

Illustration
Genesis - 2021-02-25T11:54:03+00:00
Question: How to do this more efficiently

I have this piece of code in MATLAB:       for kk=0:N-1 for mm=0:N-1 for pp=1:Np for qq=1:Np if ((kk*Ts+tau(pp)))<=(mm*Ts+tau(qq))) && ((kk+1)*Ts+tau(pp))>(mm*Ts+tau(qq))) thetaSR=(((kk+1)*Ts+tau(pp)))-((mm*Ts+tau(qq)))); F_SR_MR(kk+1,mm+1)=F_SR_MR(kk+1,mm+1)+conj(H(pp))*H(qq)*(thetaSR*exp(1i*pi*fc**thetaSR)*sinc(fc*thetaSR)); end which obviously is not very efficient. How can I re-write it more efficiently?  

Expert Answer

Profile picture of John Williams John Williams answered . 2025-11-20

It isn't necessary to do the inequality test for every possible pair of kk and mm values. Since kk and mm are integers and Ts must surely be a positive number, your pair of inequalities is logically equivalent to
 
 
 kk-mm == d
where d = floor((tau(qq)-tau(pp))/Ts). Therefore you can simply add the appropriate vectors along corresponding diagonals of F. For large N, doing it this way should save quite a bit of computation time.
 
 
F=zeros(N);
for pp=1:Np
  for qq=1:Np
    d = floor((tau(qq)-tau(pp))/Ts);
    kk = max(d,0):min(N-1,N-1+d);
    mm = kk-d;
    theta=(d+1)*Ts-(tau(qq)-tau(pp));
    ix = d+1+(N+1)*mm;
    F(ix) = F(ix)+conj(H(pp))*H(qq)*theta.*exp(1i*pi*fc*theta).*sinc(fc*theta);
  end
end


Not satisfied with the answer ?? ASK NOW

Get a Free Consultation or a Sample Assignment Review!