Codegen fails with "wrong number of input arguments" while function calls without error

6 vues (au cours des 30 derniers jours)
I'm trying to generate a mex file for the following function:
function matInt = testfun(a,b,M)
matfun = @(x) squeeze(interpn([-1 0 1],[-1,0,1],M,x(1),x(2)));
matInt = integral(@(s) matfun(a*s+(1-s)*b), 0, 1, 'ArrayValued',true);
end
using the following script:
clear; close all;
%% Test arguments
a = [.5;.3];
b = [-.2;-1];
M = randn(3,3,5,5);
%% Run function
Mint = testfun(a,b,M); % okay
%% Codegen
% error:
codegen testfun -args {a,b,M}
Running the function (so computing Mint) goes fine without any errors. But generating a mex file using the same input arguments (in the last line) throws the error:
??? Wrong number of input arguments.
Error in ==> testfun Line: 2 Column: 23
Code generation failed: View Error Report
I'm not exactly what goes wrong there, as I do not see how I do not give the correct number of input arguments.

Réponse acceptée

Mike Hosea
Mike Hosea le 1 Nov 2022
Modifié(e) : Mike Hosea le 2 Nov 2022
I can't find where this behavior of INTERPN is documented. To the contrary, we have:
>> help interpn
interpn N-D interpolation (table lookup).
Vq = interpn(X1,X2,X3,...,V,X1q,X2q,X3q,...) interpolates to find Vq,
the values of the underlying N-D function V at the query points in
arrays X1q,X2q,X3q,etc. For an N-D V, interpn should be called with
2*N+1 arguments. [snip]
I mean, the behavior is obviously useful, but the codegen version is only trying to support documented INTERPN behavior. You can rewrite your example to avoid relying on this behavior by using a nested function instead of an anonymous function:
function matInt = testfun(a,b,M)
% matfun = @(x) squeeze(interpn([-1 0 1],[-1,0,1],M,x(1),x(2)));
function Mq = matfun(x)
mout = size(M,3);
nout = size(M,4);
Mq = zeros(mout,nout,'like',M);
for j = 1:nout
for i = 1:mout
Mq(i,j) = interpn([-1 0 1],[-1,0,1],M(:,:,i,j),x(1),x(2));
end
end
end
matInt = integral(@(s) matfun(a*s+(1-s)*b), 0, 1, 'ArrayValued',true);
end
Seems like there should be another, more clever way, but it's not coming to mind at the moment.

Plus de réponses (0)

Catégories

En savoir plus sur Code Verification dans Help Center et File Exchange

Produits


Version

R2022a

Community Treasure Hunt

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

Start Hunting!

Translated by