Convert a symbolic vector to a list of scalar outputs for a function created by matlabFunction

1 Ansicht (letzte 30 Tage)
When matlabFunction creates an anonymous function, its arguments are always scalars. But when I want to use the function, my data is in vector form. Indeed, when I create the matlab function, I don't know the size of the vector. Is there some way that I can convert an n x 1 vector into n scalars for the purpose of feeding it into my matlab function? Here's an example
syms c1 c2 c3 c4 c5 c6 c7 c8
n = 5;
c = sym('c',[n,1])
f = @(c) prod(c)
jacf= matlabFunction(jacobian(f(c)))
jacf is now a function with arguments c1 ... c5, specifically
jacf =
function_handle with value:
@(c1,c2,c3,c4,c5)reshape([0.0,c3.*c4.*c5,c2.*c4.*c5,c2.*c3.*c5,c2.*c3.*c4,c3.*c4.*c5,0.0,c1.*c4.*c5,c1.*c3.*c5,c1.*c3.*c4,c2.*c4.*c5,c1.*c4.*c5,0.0,c1.*c2.*c5,c1.*c2.*c4,c2.*c3.*c5,c1.*c3.*c5,c1.*c2.*c5,0.0,c1.*c2.*c3,c2.*c3.*c4,c1.*c3.*c4,c1.*c2.*c4,c1.*c2.*c3,0.0],[5,5])
If for example my vector c = 1:5, is there some way I can break it into scalars so that I can compute
jacf(1,2,3,4,5)
Or, better, is there a way I can convert jacf into an anonymous function whose vector argument is [c1,c2,c3,c4,c5]
Thanks for any suggestions!

Akzeptierte Antwort

Andrei Bobrov
Andrei Bobrov am 15 Mär. 2018
Bearbeitet: Andrei Bobrov am 16 Mär. 2018
n = 5;
c = sym('c',[n,1]);
jacf= matlabFunction(jacobian(prod(c)),'v',{c});
use
>> c = 1:5;
>> jacf(c(:))
ans =
120 60 40 30 24
or for vectors
function out = jacf(x)
n = numel(x);
out = prod(x(repmat((1:n-1)',1,n) + tril(ones(n-1,n))));
end
or
function out = jacf(x)
n = numel(x);
e1 = eye(n);
out = prod(repmat(x(:),1,n).*~e1 + e1);
end

Weitere Antworten (0)

Kategorien

Mehr zu Code Generation finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by