Best Practice for Defining Large Constant Array in Function (Must Code-generate)
Mostrar comentarios más antiguos
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 comentarios
Alan Bindemann
el 9 de Abr. de 2020
Jeff Miller
el 10 de Abr. de 2020
What about using a static class to hold the coefficients and the function. Something along the lines of
classdef foo
properties(Constant)
coeff = [1,2,3,3;...
2,34,45,5;...
45,565,56754,43;
.
. % Many lines of coeff.
.
.];
end
methods(Static)
function y = someFunction(x)
% refer to the coefficients as foo.coef
end
end
end
Then you would call foo.someFunction(x). Might be faster.
Alan Bindemann
el 10 de Abr. de 2020
Editada: Alan Bindemann
el 10 de Abr. de 2020
Jeff Miller
el 11 de Abr. de 2020
Thanks for testing it. That's very disappointing performance in the case of the ReallySlow version of the function. Maybe it would be faster as a handle class.
But if the class doesn't speed things up and the coefficients are not used anywhere else, it's pretty hard to see any reason to prefer it over the simpler plain function approach
Alan Bindemann
el 14 de Abr. de 2020
Respuestas (1)
Sean de Wolski
el 10 de Abr. de 2020
Editada: Sean de Wolski
el 10 de Abr. de 2020
0 votos
Look at using System Objects and the MATLAB System block in Simulink. These are optimized for streaming workflows and code generation.
2 comentarios
Alan Bindemann
el 10 de Abr. de 2020
Sean de Wolski
el 16 de Abr. de 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.
Check out this video https://www.mathworks.com/videos/accelerate-image-compression-algorithm-77688.html
Categorías
Más información sobre Execution Speed en Centro de ayuda y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!