MATLAB Answers

Optimizing code run time

3 views (last 30 days)
Hi All,
I've the following function
function fun1()
[t,x] = ode15s(@(t,s) fun2(t,x), tspan , x0 ,options);
% other functions
end
function dx = fun2(t,x)
M = load(fullfile(path,'M.mat'));
:
:
dx = M*x
end
Each time fun2 is called, the same file is loaded and this increases the compute time
(calls: 52085 total time:156.848s, self time:59.780s). Of the total time taken (209s), 156s is taken for executing fun1 and 95% of the time is spent in loading the input file.
I'd like to ask for suggestions on how to get around this i.e reduce the time taken for loading/avoid loading for each function call.

  0 Comments

Sign in to comment.

Accepted Answer

per isakson
per isakson on 5 May 2020
Try to replace
M = load(fullfile(path,'M.mat'));
by
persistent M
if isempty(M)
M = load(fullfile(path,'M.mat'));
end
and see persistent

  7 Comments

Show 4 older comments
Deepa Maheshvare
Deepa Maheshvare on 5 May 2020
Thanks . So I've
classdef utils
properties (Constant)
M = load(fullfile(path, 'M.mat'));
end
methods(Static)
function M = get_M
M = load(fullfile(path, 'M.mat'));
end
end
end
And I tried the following ways
Method 1:
function fun1()
[t,x] = ode15s(@(t,s) fun2(t,x), tspan , x0 ,options);
% other functions
end
function dx = fun2(t,x)
persistent M
if isempty(M)
M = utils.get_M;
end
end
:
:
dx = M*x
end
Method 2:
function fun1()
[t,x] = ode15s(@(t,s) fun2(t,x), tspan , x0 ,options);
end
function dx = fun2(t,x)
M = utils.M
end
:
:
dx = M*x
end
In the first case, M = utils.get_M is called once and in the second method M = utils.M is called as many times fun2 is called by fun1. From what you have explained, is it right to understand `class utils` is loaded only once even if it's called multiple times.
per isakson
per isakson on 5 May 2020
MATLAB evaluates the expressions when loading the class. Therefore, the values MATLAB assigns to RN are the result of a single call to the rand function and do not change with subsequent references to NamedConst.RN.
Searching and reading the documentation is a large part of mastering Matlab.
Method 1.
I see no point in using the static method, get_H. It save on overhead to call load() directly in fun2.
Method 2.
Yes. (However, it's more convicing to test than listen to me.)
Deepa Maheshvare
Deepa Maheshvare on 6 May 2020
Cool! I've read and implemented it already. Thanks.

Sign in to comment.

More Answers (0)

Products


Release

R2019b