How can I reduce the execution time of my code?
    20 views (last 30 days)
  
       Show older comments
    
I wrote this code. it is working for m=32 and I am getting output with in 2 minutes. But if I am putting m=64, it is running. I checked for 24 hours. I am not getting the output. Can you tell me how I can reduce the execution time of this code. 
clc;
clear all;
close all;
a=1/3;
delta=1.3;
Gamma=0.6;
global m t matrix matrix1
m=32;
matrix = zeros(m, m);
matrix1=zeros(m,m);
for i=1:m
    matrix(1,i)= 1/sqrt(m);
    for l=1:m
        t(l)=(l-0.5)./m;
    end
end
for i = 1:m-1
    for j = 0:(i - 1)
        for k = 1:(2^j + 1)-1
            if i == 2^j + k - 1
                fprintf('For i = %d, j = %d, and k = %d\n', i, j, k)
                for l = 1:m % Changed variable name from j to l
                    t_val = t(l);
                    matrix1(0+1,l) = (t_val^a)/(gamma(1+a)*sqrt(m));
                    if (k - 1) / 2^j <= t_val
                        if t_val < (k - 0.5) / 2^j
                            matrix(i+1, l) = 1/sqrt(m) *(2^(j/2));
                            matrix1(i+1, l) = 2^(j/2) *(1/(gamma(1+a)*sqrt(m)) * (t_val - (k - 1) / 2^j)^a);
                        elseif t_val < k / 2^j
                            matrix(i+1, l) = 1/sqrt(m) * (-2^(j/2));
                            matrix1(i+1, l) = 2^(j/2) * (1/(gamma(1+a)*sqrt(m)) * (t_val - (k - 1) / 2^j)^a - 2 / (gamma(1+a)*sqrt(m)) * (t_val - (k - 0.5) / 2^j)^(a));
                        elseif t_val < 1
                            matrix1(i+1, l) = 2^(j/2) * (1/(gamma(1+a)*sqrt(m))* (t_val - (k - 1) / 2^j)^(a) - (2 / (gamma(1+a)*sqrt(m)) * (t_val - (k - 0.5) / 2^j)^(a)) + (1 / (gamma(1+a)*sqrt(m)) * (t_val - k / 2^j)^(a)))
                        else
                            matrix(i+1, l) = 0;
                            matrix1(i+1, l) = 0;
                        end
                    end
                end
            end
        end
    end
end
disp(matrix) % Display the resulting matrix
disp(matrix1) % Operational matrix
cstart=zeros(1,2*m);
G=fsolve(@nddt,cstart);
G
for i=1:m
    G1(i)=G(i);
end
for i=1:m
    u(i)=delta+G1*matrix1(:,i);
end
plot(t,u,'-b')
hold on
p=1;
for j=m+1:2*m
    G2(p)=G(j);
    p=p+1;
end
for i=1:m
    v(i)=Gamma+G2*matrix1(:,i);
end
plot(t,v,'-r')
function [F]=nddt(E)
delta = 1.3;
Gamma = 0.6;
global m t matrix matrix1
for l=1:m
    F1(l)=E(1:m)* matrix(:,l) - t(l)*E(1:m)* matrix1(:,1)- t(l)*delta +(E(1:m)* matrix1(:,1) + delta)*(E(m+1:2*m)* matrix1(:,1) + Gamma);
    F2(l)=E(m+1:2*m)* matrix(:,l) - (E(1:m) * matrix1(:,1) + delta)*(E(m+1:2*m)*matrix1(:,1)+ Gamma) + t(l)*(E(m+1:2*m) * matrix1(:,1) + Gamma);
end
F=[F1,F2];
end
5 Comments
  Walter Roberson
      
      
 on 17 Apr 2024
				for i = 1:m-1
    for j = 0:(i - 1)
        for k = 1:(2^j + 1)-1
            if i == 2^j + k - 1
That can be rewritten, 
for i = 1:m-1
    for j = 0:(i - 1)
        k = i - 2^j + 1
        if k >= 1 & k <= 2^j
Answers (2)
  Dinesh
      
 on 12 Apr 2024
        Hi Surath,
Here are some optimizations that I could identify in your code:
- Precompute Reusable Values: Avoid repetitive computation of constants or expressions within loops.
codegammaFactor = 1 / (gamma(1 + a) * sqrt(m));
- Vectorize Conditional Assignments: Use logical indexing to apply conditions across a vector or matrix.
codecondition = (k - 1) / 2^j <= t & t < k / 2^j;
matrix1(i, condition) = 2^(j/2) * gammaFactor .* (t(condition) - (k - 1) / 2^j).^a;
- Optimize Matrix Operations: For operations applied to each row or column, use matrix multiplication or dot products.
codeG1 = G(1:m);
u = delta + G1 * matrix1;
Further Optimization Strategies:
- Parallel Computing: For large-scale matrix operations or loops that can run independently, consider using MATLAB's parallel computing capabilities (parfor loops, distributed arrays).
- Profiling and Algorithm Refinement: Utilize MATLAB's profiler to identify bottlenecks. In some cases, rethinking the algorithm or applying mathematical simplifications can lead to significant performance gains.
Reference Links:
2 Comments
  Torsten
      
      
 on 12 Apr 2024
				You could try "lsqnonlin" or "fmincon" instead of "fsolve" to solve your quadratic system of equations, but these are the only options you have.
  Walter Roberson
      
      
 on 17 Apr 2024
        for i = 1:m-1
    for j = 0:(i - 1)
        for k = 1:(2^j + 1)-1
            if i == 2^j + k - 1
                fprintf('For i = %d, j = %d, and k = %d\n', i, j, k)
                for l = 1:m % Changed variable name from j to l
You have 4 nested loops, three of which effectively have an upper limit of m, and the fourth has a much higher upper limit. When you double your m you have to expect that it will take notably longer.
See Also
Categories
				Find more on Matrix Indexing 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!




