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

1 次查看(过去 30 天)
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!

采纳的回答

Andrei Bobrov
Andrei Bobrov 2018-3-15
编辑:Andrei Bobrov 2018-3-16
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

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Code Generation 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by