MATLAB Answers

Best Practice for Defining Large Constant Array in Function (Must Code-generate)

24 views (last 30 days)
Alan Bindemann
Alan Bindemann on 9 Apr 2020
Commented: Sean de Wolski on 16 Apr 2020
I have a function that uses a largish array of constant Legendre polynomial coefficients. I'm curious, from a performance standpoint, of the best way to define these constants in a MATLAB Function. The simplest approach is to define them directly:
function y = foo(x)
%#codegen
coeff = [1,2,3,3;...
2,34,45,5;...
45,565,56754,43;
.
. % Many lines of coeff.
.
.];
y = someFunction(x,coeff);
end
I could make coeff persistent as follows, but am not sure if there is any performance benefit of doing this:
function y = foo(x)
%#codegen
persistent coeff
if isempty(coeff)
coeff = [1,2,3,3;...
2,34,45,5;...
45,565,56754,43;
.
. % Many lines of coeff.
.
.];
end
y = someFunction(x,coeff);
end
I'm curious about the consesus on best practice in this circumstance, I need the resulting function to code-generate in a Simulink MATLAB function.
  5 Comments
Alan Bindemann
Alan Bindemann on 14 Apr 2020
Jeff,
I tried it as a handle class and didn't notice any difference in performance. The only other thought I had on this was to call the coder.const function when setting the coefficients. This might help with performance in the generated code. I didn't see any difference in MATLAB or in Simulink when I did this, but wouldn't expect to either.
coeff = coder.const([1,2,3,3;...
2,34,45,5;...
45,565,56754,43;
.
. % Many lines of coeff.
.
.]);

Sign in to comment.

Answers (1)

Sean de Wolski
Sean de Wolski on 10 Apr 2020
Edited: Sean de Wolski on 10 Apr 2020
Look at using System Objects and the MATLAB System block in Simulink. These are optimized for streaming workflows and code generation.
  2 Comments
Sean de Wolski
Sean de Wolski on 16 Apr 2020
System objects are fit well for the dual use case that you point out. I.e. use in MATLAB or direct reuse in Simulink with the MATLAB System Block.
I don't understand all of the internals, but they're supposed to be efficient in how the JIT or generated code manage things to make the step() method as fast as possible for real-time systems. Hence why the DSP System Toolbox has many of these objects all geared for code generation. If your states aren't changing, they may be of little value. In my experience, much of the OO overhead was improved in >=R2015b with the new MATLAB execution engine.

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!