Converting a vector to multiple variables required as input for 'matlabFunction'.
5 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Taimoor Saif Talpur
le 24 Sep 2012
Commenté : Graham Rowe
le 7 Nov 2020
I am converting symbolic function to a Matlab function using 'matlabFunction'.
For e.g.
syms x y
g=matlabFunction(x+y-1)
Output
g = @(x,y)x+y-1.0
The returned matlab function 'g' accepts individual variables like g(1,1). However, I want to give inputs as a vector, like,
input = [1 1]
g(input)
I get error 'Not enough input arguments.' I want to give input as a single vector because number of input in my actual function vary during run-time. Any idea how to convert a vector to multiple variable at run-time efficiently or any other solution.
0 commentaires
Réponse acceptée
Andrei Bobrov
le 24 Sep 2012
input = {1 1}
g(input{:})
5 commentaires
Leo Simon
le 6 Nov 2012
Thanks Walter
I could do everything without anonymous functions, but would prefer not to because of another infuriating matlab property which is that I can't define a function within an m-file, have to do it within a function. Should I just give up on passing an anonymous function to fsolve? I'm willing to do it the hard way if there is a hard way!
Walter Roberson
le 6 Nov 2012
I do not understand what you mean about can't define a function within an m-file ?
The code I show above involves passing anonymous functions to fsolve: it just uses a helper function which would be the same for all cases. The "g" that I reference in the expression call_on(g, x) is the anonymous function constructed via matlabFunction. The version that does not use this (invariant) helper function would need to use some nasty MATLAB behavior to fudge the temporary variable.
Plus de réponses (2)
Brad Carman
le 26 Jan 2018
The matlab documentation fails to mention that it's possible to set this up with matlabFunciton() itself. I've discovered that how you input the 'Vars' argument adjusts how the function is built. Using a vector input of variables for 'Vars' will give you what you want. See the following example:
syms x y
z = x+y;
Without vector input:
matlabFunction(z, 'Vars', {x, y})
function_handle with value:
@(x,y)x+y
With vector input:
matlabFunction(z, 'Vars', {[x, y]})
function_handle with value:
@(in1)in1(:,1)+in1(:,2)
3 commentaires
Ti Miller-Jackson
le 21 Août 2019
Oh my gosh this works so well! You just saved me many hours. God bless you sir!
Graham Rowe
le 7 Nov 2020
This should be the accepted answer. So much more elegant than defining temporary variables that get created and then removed at run time.
Azzi Abdelmalek
le 24 Sep 2012
Modifié(e) : Azzi Abdelmalek
le 24 Sep 2012
g = @(x,y)x+y-1.0
%g is a function of two inputs x and y, if you want one vector input
g=@(x) x(1)+x(2)-1.0
%then
g([2 3])
=4
Voir également
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!