get ridoff "for loops" while defining matrices elements, incl. improvement and reference

Hello Community,
is it possible to write a code which is faster than my version?
function D = Dp(N)
D = (zeros(N-1,N-1));
for i=1:N-1
for j=1:N-1
if i ~= j
D(i,j)= -.5 * sin(j*pi/N)^2/sin(i*pi/N)^2 *(-1)^(i+j)/(sin(pi*(i+j)/(2*N))*sin(pi*(i-j)/(2*N)));
else
D(i,j) = 3/2 * cos(pi*i/N)/sin(pi*i/N)^2;
end
end
end
end
the reference i should inplement is:
my "optimized" version:
function D = Dp(N)
D = (zeros(N-1,N-1));
for i=1:N-1
for j=1:N-1
if i ~= j
D(i,j)= -.5 * sin(j*pi/N)^2/sin(i*pi/N)^2 *(-1)^(i+j)/(sin(pi*(i+j)/(2*N))*sin(pi*(i-j)/(2*N)));
else
end
end
end
D = D + diag(1.5 * cos(pi*(1:N-1)/N)./sin(pi*(1:N-1)/N).^2);
end

 Accepted Answer

Hi Marko,
Since you want to initilialise each and every element of your matrix with a different value, you'll have to visit each element of the matrix in any case. You can try vectorising your code to remove the nested loops using meshgrid/ndgrid but this may not necessarily provide an improvement in performance (running time).
Below are some useful threads where the code has been vectorized to remove the nested loops:
PS: I tried to run your code using parfor but that deprecated the performance due to overhead.
Thanks

More Answers (0)

Categories

Find more on Loops and Conditional Statements in Help Center and File Exchange

Products

Asked:

on 7 Jan 2021

Answered:

on 12 Jan 2021

Community Treasure Hunt

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

Start Hunting!