How can I call (a lot of) user-defined functions in Simulink?

9 visualizaciones (últimos 30 días)
Emin Ucer
Emin Ucer el 8 de Mzo. de 2021
Editada: Emin Ucer el 21 de Sept. de 2021
Hi all,
I have 416 seperate M-file functions located in a local folder under the current folder, e.g.
Functions\fnc_1.m
Functions\fnc_2.m
....
Functions\fnc_416.m
I need to call all of these functions in a loop in a Matlab function block in Simulink, e.g.
for i=1:416
out = fnc_i(some_arguments);
end
I tried using coder.extrinsic but it can only work if the function is located in the current folder and its name is explicity defined like
coder.extrinsic('Functions\fnc_52');
out = fnc_52(some_arguments);
But, i need to call them in a loop, without explicity writing out all the functions' names. Therefore, I used eval() function, e.g.
for i=1:416
filename = strcat(char(39),'Functions\fnc_',num2str(i),char(39));
eval(strcat('coder.extrinsic(',filename,');'));
out = eval(strcat('fnc_',num2str(i),'(some_arguments);'));
end
But, It throws the errror --> Function 'strcat' not supported for code generation.
I seem to be stuck now. Do you know any way (preferably much easier) of calling functions located in local folders from Simulink??
Thank you
Solution Edit
I realized that we can call directly any function from inside a Matlab Function Bock in Simulink as long as the function is in the current folder (or your function directory is added to your current directory). This at least works in R2020a. To call functions in a loop like I tried to do, you can follow the solution below.
function y = MatlabFunctionBlock(x)
% We need these two functions, so add them as extrinsic functions
coder.extrinsic('strcat');
coder.extrinsic('eval');
y = zeros(416,1);
for i = 1:416
f = eval(strcat('@(x) fnc_',num2str(i),'(x)'));
y(i) = f(x);
end
end
This script can call all the 416 functions one by one by their name. Hope that helps.
Solution Edit (for R2021a and higher)
Turns out that the above method is no longer working for the 2021a release (2021a does not support eval code generation). A more efficient (faster) and elegent solution is the following
function y = MatlabFunctionBlock(x)
y = zeros(416,1);
for i = 1:416
f = sprintf('fnc_%d',i);
y(i) = feval(f,X);;
end
end

Respuesta aceptada

Walter Roberson
Walter Roberson el 8 de Mzo. de 2021
Editada: Walter Roberson el 8 de Mzo. de 2021
I would suggest writing a small bit of code that mechanically generates a cell array of function handles, one for each file; create it as a function in a .m and call it from the main MATLAB function block, and then iterate through invoking the function handles. Make the array of handles persistent for efficiency
persistent fcn
if isempty(fcn)
fcn = populate_fcn();
end
  1 comentario
Emin Ucer
Emin Ucer el 8 de Mzo. de 2021
Thanks. This helped me work around the problem using function handles. I edited my question and presented my owrn solution. Maybe a faster and more efficient code can be written using arrays of functions handles though. Until then, this code should do the job fine.

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Simulink Functions en Help Center y File Exchange.

Productos


Versión

R2020a

Community Treasure Hunt

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

Start Hunting!

Translated by