Try:
>> x = sym('x',[1 2]) x = [ x1, x2] >> x(1) ans = x1 >> x(2) ans = x2 >> whos x Name Size Bytes Class Attributes x 1x2 112 sym
This is similar to the entry:
>> syms a1 a2 >> a = [a1 a2]
EDIT:
First, we create an expression from symbolic variables:
a = sym('a', [1 2]); x = sym('x', [1 2]); expr = x(1)/a(1)+x(2)/a(2);
Then we convert it to the regular MATLAB function:
fh = matlabFunction(expr, 'file','test1', 'vars',{a,x});
Function Generated:
function expr = test1(in1,in2) a1 = in1(:,1); a2 = in1(:,2); x1 = in2(:,1); x2 = in2(:,2); expr = x1./a1+x2./a2; end
Initially, I was thinking about using regular expressions to fix the created function descriptor. This is a much messier hack, so I recommend using the previous approach:
% convert to a function handle as string fh = matlabFunction(expr); str = char(fh); % separate the header from the body of the function handle T = regexp(char(fh), '@\((.*)\)(.*)', 'tokens', 'once'); [args,body] = deal(T{:}); % extract the name of the unique arguments (without the index number) args = regexp(args, '(\w+)\d+', 'tokens'); args = unique([args{:}], 'stable'); % convert arguments from: x1 into x(1) r = sprintf('%s|', args{:}); r = r(1:end-1); body = regexprep(body, ['(' r ')(\d+)'], '$1($2)'); % build the arguments list of the new function: @(a,b,c) head = sprintf('%s,', args{:}); head = head(1:end-1); % put things back together to form a function handle f = str2func(['@(' head ') ' body])
Resulting function descriptor:
>> f f = @(a,x)x(1)./a(1)+x(2)./a(2)