Tricks to increase computational speed for D = (A + A*B).*C

Hello
I am working on computing the time evolution of a distribution. The distribution evolves as follows
g(t + dt) = (g(t) + dt*MAT*g(t)).*exp(-k*dt)
here g and k are column vector of size m*1, MAT is a square matrix of size m*m.
Say i have to evolve it "n" times, the way I have attempted my solution is
g = zeros(m,n)
g(:,1) = g0 % initalising
MAT, k = something pre calculated
for i = 1:1:n
g(:,i+1) = (g(:,i) + dt*MAT*g(:,i) ).*exp(-k*dt)
end
This is the conventional basic way I guess but it takes a long time. How else can I implement the evolution to make it faster.
For perspective the matrices are of the order of 10,000*10,000 and I would like to evolve it for another 5000 ish points
MAT is a mostly a sparse matrix. It has significant non zero diagonal elements and in a given row maybe 50-60 elements are non zero.
Grateful for any suggestions!

 Accepted Answer

To optimize the computation of the large matrix sizes and the sparsity of MAT, you should consider the following approaches:
  1. Use Sparse Matrices: If you haven't already, convert MAT to a sparse matrix format in MATLAB using sparse(MAT). This will significantly speed up matrix-vector multiplications for large, sparse matrices.
  2. Precompute Static Values: If exp(-k*dt) does not change over iterations, compute it once before the loop and reuse the result.
  3. Avoid Growing Arrays in a Loop: Preallocate the full size of g before the loop to avoid dynamically resizing it during each iteration, which is costly.
Given these points, your revised code snippet would look something like this:
% Assuming MAT is already defined and is sparse
% Convert MAT to sparse format if not already
% MAT = sparse(MAT); % Uncomment if MAT is not already sparse
% Precompute constants
exp_neg_kdt = exp(-k*dt);
% Preallocate g
g = zeros(m, n+1);
g(:,1) = g0; % Initial condition
% Time evolution loop
for i = 1:n
g(:,i+1) = (g(:,i) + dt*MAT*g(:,i)) .* exp_neg_kdt;
end
I hope this helps!
Animesh

More Answers (0)

Categories

Find more on Mathematics in Help Center and File Exchange

Products

Release

R2023a

Asked:

on 19 Jun 2024

Commented:

on 19 Jun 2024

Community Treasure Hunt

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

Start Hunting!