MATLAB: How to call (a lot of) user-defined functions in Simulink

code generationcoderMATLABmatlab functionsimulinkuser-defined function call from simulink

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(node),'(x)'));
y(i) = f(x);
end
end
This script can call all the 416 functions one by one by their name. Hope that helps.

Best Answer

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