How to generate symbolic variables dynamically at run-time?
古いコメントを表示
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."
1 件のコメント
Christopher Creutzig
2011 年 1 月 24 日
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.
採用された回答
その他の回答 (2 件)
Walter Roberson
2011 年 1 月 21 日
Your code,
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 件のコメント
Ali
2011 年 1 月 24 日
Walter Roberson
2012 年 2 月 23 日
Note: that sym() syntax with a size is R2010b or later.
Viki
2019 年 4 月 8 日
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
1 件のコメント
Steven Lord
2019 年 4 月 8 日
Doing this "poofs" variables into the workspace and should be discouraged for the reasons given here.
カテゴリ
ヘルプ センター および File Exchange で Code Performance についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!