Evaluating symbolic function with a vector
74 views (last 30 days)
Show older comments
Diego
on 21 Apr 2023
Commented: Walter Roberson
on 21 Apr 2023
I know this has been asked before, but none of the answers I've found have been helpful.
Here's the simple example of what I'm trying to do:
syms x1 x2
f(x1,x2) = x1 + x2;
x = [ 1 1];
f(x)
I would expect this to return:
ans =
2
Which, of course, is not working, as seen in the error stated above.
Any insights on how can I define a function that accepts a vector of values for many variables?
0 Comments
Accepted Answer
Walter Roberson
on 21 Apr 2023
MATLAB does not permit defining symbolic functions that accept vectors of values and distributes the values into multiple parameters.
In the special case that it is acceptable to run the calculation numerically instead of symbolically, then use
syms x1 x2
f(x1,x2) = x1 + x2;
F = matlabFunction(f, 'vars', {[x1 x2]})
x = [ 1 1];
F(x)
Notice that you had to use the 'vars' option and that you needed to pass a cell array to the the 'vars' option. Each cell entry lists variables that are to be bundled into a single input parameter.
Notice that once you have used matlabFunction to bundle multiple inputs into one parameter, you cannot then invoke the function with multiple parameters -- F(x(1), x(2)) would be an error.
2 Comments
Walter Roberson
on 21 Apr 2023
Additional note:
If the function produces a non-scalar output (given scalar inputs) then there is nothing more that can be done. However, if the function produces a scalar output for scalar inputs, then much of the time matlabFunction will emit a version of the function that can be passed multiple values for each parameter and will produce an output based on each corresponding inputs. For example given x1^2+x2 then matlabFunction would emit code that did x1.^2+x2 and so could be passed matrix or vector (or, of course, scalar) inputs.
When matlabFunction is able to vectorize the function, then if you bundle multiple inputs together into one parameter, the way it operates to unpack the multiple values corresponds to the shape of the vector (or even array) of variables in the cell array entry. So in the case of [x1 x2] you specify the variables as differerent columns of that entry, and the packed code will extract each column of 2D arrays of inputs as corresponding to the inputs. In If you had passed [x1; x2] to 'vars' then you would have specified x1 and x2 as rows there, and matlabFunction would create the code to extract by rows -- F(DATA) would treat DATA(1,:) as x1, DATA(2,:) as x2 in such a case.
Not everything can be vectorized. For example if you had int() and a variable as the upper bounds or lower bounds, then the integral() call that matlabFunction generated would not be able to handle multiple upper or lower bounds being passed in.
More Answers (1)
Chunru
on 21 Apr 2023
% take x1 and x2 as two variables
syms x1 x2
f(x1,x2) = x1 + x2;
x = [ 1 1];
f(x(1), x(2))
0 Comments
See Also
Categories
Find more on Symbolic Variables, Expressions, Functions, and Preferences in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!