# How to generate symbolic variables dynamically at run-time?

21 views (last 30 days)
Ali on 21 Jan 2011
Commented: Steven Lord on 8 Apr 2019
I am trying to generate a set of equations for user input matrices.
For example, if the user inputs:
[0 1 0 1;
1 0 1 0;
0 0 1 1];
I want to generate equations
Y1 = Q12 + Q44
Y2 = Q21 + Q31
Y3 = Q33 + Q44
and assign these equations to symbolic vars y1, y2, and y3.
.
In addition, at some other point I want to be able to substitute values symbolic values for Q12 = P12 + R1, etc, and have all the equations automatically update all the symbolic values.
.
I have tried to use:
y = sym(sprintf('q%d%d', [m k]))
method described here, but the matrix elements q12, q44, etc are not substitutable. These vars are not symbolic variable in themselves.
.
The 'eval(..)' function and other symbolic manipulation functions cannot be used to simply/substitute other values.
I can do something like this:
syms q11, q12, q13, .. q44 etc
for all positions of the matrix, and then do:
Y = [q11, q12,..; ... q44]
but this is tedious and does not allow for a general function that handles any matrix of any size.
I guess, my question is how to dynamically create symbolic variables. I can generate a character string 'Q12', but then I can't seem to be able to convert it to a symbolic variable.
For example, if vars = {'Q12'}, then
char(vars(1)) = sym(char(vars(1)), 'real')
gives an error
"Conversion to double from cell is not possible."
Christopher Creutzig on 24 Jan 2011
What exactly do you mean by “assign these equations to symbolic vars y1, y2, and y3”? Also note that you can set Y = sym('q', [4 4]) as a shorthand for your tedious definition of Y.

Kenneth Eaton on 24 Jan 2011
You can generate your system of equations from a matrix of zeroes and ones using just the SYM function and some basic arithmetic operations like SUM and .* that are overloaded for symbolic objects:
>> C = [0 1 0 1; 1 0 1 0; 0 0 1 1]; % The sample input matrix
>> Q = sym(sym('Q%d%d',size(C)),'real') % Create a matrix of Qxy variables
Q =
[ Q11, Q12, Q13, Q14]
[ Q21, Q22, Q23, Q24]
[ Q31, Q32, Q33, Q34]
>> Y = sum(sym(C).*Q,2) % Perform element-wise multiplication of Q by a
% symbolic version of C, then sum the result
Y = % along the rows
Q12 + Q14
Q21 + Q23
Q33 + Q34
Kenneth Eaton on 26 Jan 2011
I guess it doesn't accept Q12 because that isn't a symbolic variable *in the workspace*, just a symbolic variable *within the set of equations* in Y.

Walter Roberson on 21 Jan 2011
if vars = {'Q12'}, then char(vars(1)) = sym(char(vars(1)), 'real')
would need to be
if isequal(vars, {'Q12'}), then char(vars(1)) = sym(char(vars{1}), 'real')
in order to be consistent.
Have you consider using
Q = sym('Q', size(UserMatrix));
Your example equations look inconsistent to me, by the way. I do not see how Q44 can occur in two of them.
##### 2 CommentsShowHide 1 older comment
Walter Roberson on 23 Feb 2012
Note: that sym() syntax with a size is R2010b or later.

Viki on 8 Apr 2019
Consider a symbolic matrix created as,
S = sym('s%d%d',[3,3], 'real');
It would fetch you
S =
[ s11, s12, s13]
[ s21, s22, s23]
[ s31, s32, s33]
Now, if you want to have each element of the symbolic matrix S as an independent symbolic variable; use the following code
for i = 1:3
for j = 1:3
feval('syms',S(i,j));
end
end
Steven Lord on 8 Apr 2019
Doing this "poofs" variables into the workspace and should be discouraged for the reasons given here.