Change size of input arguments without recompiling mex with codegen
4 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Alessandro
el 26 de En. de 2025
Comentada: Alessandro
el 4 de Feb. de 2025
I compiled a simple function with matlab coder. The function takes three input arguments: xvec is [nx,1], yvec is [ny,1] and zmat is [nx,ny]. All is good the first time I run the mex function, but if I subsequently change the size of one of the input arrays (say I change nx from nx=8 to nx=7), the function crashes. Of course I can compile again the code and it runs, but I really want to avoid recompilation every time I change the dimension of the inputs!
MWE here:
clear
clc
close all
nx = 8;
ny = 3;
xvec = linspace(0,1,nx)';
yvec = linspace(0,1,ny)';
zmat = xvec.^2+yvec'; % [nx,ny]
%size(zmat)
disp('Calling myfun...')
res = myfun(xvec,yvec,zmat);
% MEX with codegen
disp('Compiling MEX...')
cfg = coder.config('mex');
cfg.GenerateReport = true;
codegen -config cfg myfun -args {xvec,yvec,zmat} -o myfun_mex
disp('Calling myfun_mex...')
res_mex = myfun_mex(xvec,yvec,zmat);
err_mex = abs(res-res_mex)
and here is the function:
function res = myfun(x,y,z)
res = sum(x)+sum(y)+sum(sum(z));
end
First time, I compile and it runs OK. Then, if I set nx=7, it crashes with the following error message:
```
Incorrect size for expression 'x': expected [8x1] but found [7x1].
Error in myfun_mex
Error in main (line 22)
res_mex = myfun_mex(xvec,yvec,zmat);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
```
Any help is greatly appreciated, thanks!
0 comentarios
Respuesta aceptada
Naman Saraf
el 28 de En. de 2025
Editada: Naman Saraf
el 28 de En. de 2025
Hi,
You can specify the inputs to be "unbounded" during code generation. MATLAB Coder then generates code that can accept inputs of different sizes at runtime without requiring to regenerate the code.
The command line way of achieving this is shown in the code below. You can also specify this using the MATLAB Coder App.
Please refer to the following page for additional details.
%====
clear
clc
close all
nx = 8;
ny = 3;
xvec = linspace(0,1,nx)';
yvec = linspace(0,1,ny)';
zmat = xvec.^2+yvec'; % [nx,ny]
%size(zmat)
disp('Calling myfun...')
res = myfun(xvec,yvec,zmat);
% MEX with codegen
disp('Compiling MEX...')
cfg = coder.config('mex');
cfg.GenerateReport = true;
% specify unbounded inputs for code generation
xvecCoder = coder.typeof(0, [inf,1]);
yvecCoder = coder.typeof(0, [inf,1]);
zmatCoder = coder.typeof(0, [inf,inf]);
codegen -config cfg myfun -args {xvecCoder,yvecCoder,zmatCoder} -o myfun_mex
disp('Calling myfun_mex...')
res_mex = myfun_mex(xvec,yvec,zmat);
err_mex = abs(res-res_mex)
% different inputs
nx = 7;
ny = 4;
xvecNew = linspace(0,1,nx)';
yvecNew = linspace(0,1,ny)';
zmatNew = xvec.^2+yvec'; % [nx,ny]
disp('Calling myfun_mex with new inputs ...')
res_mexNew = myfun_mex(xvecNew,yvecNew,zmatNew);
%====
3 comentarios
Ram Kokku
el 4 de Feb. de 2025
@Alessandro, As of R2024b, GPU Coder does not support defining unbounded variables as GPU input. You are hitting that limitation. However, bounded variable size inputs are supported. so,
coder.typeof(0, [<large number>, 1], [1, 0], 'Gpu', true)
should work.
Más respuestas (1)
Ver también
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!