How to ensure that dynamically create symbolically variables are real?
    5 views (last 30 days)
  
       Show older comments
    
    Kevin Bachovchin
      
 on 20 Feb 2014
  
    
    
    
    
    Edited: Kevin Bachovchin
      
 on 21 Feb 2014
            Hello,
I'm creating symbolic variables dynamically and I wanted to ensure that the symbolic variables are real.
I have the code
clear all
index = {'1'};
List = {'A','B','C'};
A=sym(strcat(List,index))
How can I modify this to make sure that the symbolic variables stored in A are real? I have tried changing to A=sym(strcat(List,index),'real'), but this doesn't work.
I'm looking to do something like
    syms A1 B1 C1 real
    A = [A1 B1 C1]
except I want to declare the variable names dynamically.
(I can't assume that List will contain alphabetically ordered letters. It is whatever list the user inputs.)
Thank you, Kevin
1 Comment
  Matt Tearle
    
 on 20 Feb 2014
				I'm assuming you know that dynamically created variable names make for hideous programming, right? ( Obligatory link )
But maybe you have a reason, involving users and symbolic stuff, so... answer below.
Accepted Answer
  Kevin Bachovchin
      
 on 20 Feb 2014
        2 Comments
  Walter Roberson
      
      
 on 21 Feb 2014
				Now try again with variable names that are more than one character long.
More Answers (2)
  Matt Tearle
    
 on 20 Feb 2014
        
      Edited: Matt Tearle
    
 on 20 Feb 2014
  
      This, maybe?
names = strcat(List,index,{' '})
eval(['syms ',names{:},'real'])
eval(['A = [',names{:},']'])
Ergh. I shall now go take a shower...
2 Comments
  Matt Tearle
    
 on 21 Feb 2014
				
      Edited: Matt Tearle
    
 on 21 Feb 2014
  
			I don't understand the objection. You said:
I'm looking to do something like
    syms A1 B1 C1 real
    A = [A1 B1 C1]
except I want to declare the variable names dynamically.
As far as I can see, that's exactly what my code does -- I get A1, B1, and C1 as real symbolic variables, then A is a 1x3 sym created from them.
  Walter Roberson
      
      
 on 21 Feb 2014
        A(1:length(List),1) = sym(0);
for K = 1 : length(List)
  A(K) = sym(List{K});
end
A = sym(A, 'real');
The behavior you are trying to use does not work because there is no functionality for sym() that even approximates it. You can pass a single string (horizontal char vector) or you can pass an existing symbolic array or you can pass a numeric array. No syntax for multiple strings. No syntax for multiple existing symbolic arrays.
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!

