diff m-toolbox/classes/+utils/@prog/convertComString.m @ 0:f0afece42f48

Import.
author Daniele Nicolodi <nicolodi@science.unitn.it>
date Wed, 23 Nov 2011 19:22:13 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/m-toolbox/classes/+utils/@prog/convertComString.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,209 @@
+function output = convertComString(varargin)
+% replaceString changes the input string accordingly to a predefined list of rules
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% DESCRIPTION: CONVERTCOMSTRING hanges the input string accordingly to a
+%              predefined list of rules, to convert between MATLAB, MUPAD
+%              and MATHEMATICA command string syntax.
+%              This supports conversions: MATLAB <-> MUPAD
+%                                         MATLAB <-> MATHEMATICA
+%
+% CALL:        output = convertComString('string', conversion);
+%              
+% PARAMETERS:
+%              conversion     A string defining the conversion:
+%                           - 'ToSymbolic'       MATLAB --> Symbolic (MUPAD)
+%                           - 'ToMathematica'    MATLAB --> MATHEMATICA
+%                           - 'FromSymbolic'    MUPAD (Symbolic) --> MATLAB
+%                           - 'FromMathematica'  MATHEMATICA --> MATLAB
+%
+% EXAMPLES:
+%              output = convertComString('(a.*b).*sin(pi)','ToMathematica')
+%              output = convertComString('Sin[3*Pi]/Cos[Pi]','FromMathematica')
+%              output = convertComString('(a.*b).*sin(pi)','ToSymbolic')
+%              output = convertComString('sin(3*PI)/cos(PI)','FromSymbolic')
+%              output = convertComString('PI*sin(3*PI)/cos(PI)','FromSymbolic')
+% 
+% VERSION:     $Id: convertComString.m,v 1.6 2010/03/20 14:50:49 hewitson Exp $
+%              Alpha version
+%
+% HISTORY:     27-05-2009 N Tateo
+%                 Creation
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+output = varargin{1};
+direct = varargin{2};
+
+% Generic substitutions (tipically the bidirectional ones, such as unique
+% combinations of chars) are defined in the following list.
+% Perticular substitutions (such as the imaginary 'i', but not the 'i'
+% inside a string) are performed preliminarly in the preliminaryCheck
+% function.
+
+% Rules to/from MATHEMATICA:
+% These rules are bidirectional;
+mathematicaRule = {...
+    './' , '/'  ; ...
+    '.*' , '*' ; ...
+    '.^' , '^' ; ...
+    };
+
+% Rules to/from MUPAD:
+% These rules are bidirectional;
+mupadRule = {...
+    './' , '/' ; ...
+    '.*' , '*' ; ...
+    '.^' , '^' ; ...
+    '1I' , 'I' ; ...
+    };
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+switch lower(direct)
+    case 'tosymbolic'
+        rule = mupadRule;
+        output = preliminaryCheckSymb(output,1);
+        direction = 1;
+    case 'tomathematica'
+        rule = mathematicaRule;
+        output = preliminaryCheckMath(output,1);
+        direction = 1;
+    case 'fromsymbolic'
+        rule = mupadRule;
+        output = preliminaryCheckSymb(output,2);
+        direction = 0;
+    case 'frommathematica'
+        rule = mathematicaRule;
+        output = preliminaryCheckMath(output,2);
+        direction = 0;
+    otherwise
+        error('*** ''conversion'' parameter not recognized.')
+end    
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Now performs the standard substitution, according to the rule matrix:
+if direction % from Matlab
+    for ii=1:size(rule,1)
+        output = strrep(output,rule{ii,1},rule{ii,2});
+        output = regexprep(output, '([0-9]+)I', '$1*I');
+    end
+else         % to Matlab
+    for ii=1:size(rule,1)
+        output = strrep(output,rule{ii,2},rule{ii,1});
+    end
+end
+
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+    function myout = preliminaryCheckMath(mystr,mynumb)
+    % Performs a list of complex substitutions:
+    % - search for function names and substitute the corresponding
+    %   parentheses; for example, sin(...) --> Sin[...]
+    % - search for e (as in 4E5) and converts in 10^ .
+    % - search for i (as in 2+4i) and converts in I.
+    % - search for pi (not inside strings) and converts in Pi.
+    %
+    % Parameter: mynumb = 1 MATLAB --> MATHEMATICA,
+    %                   = 2 MATHEMATICA --> MATLAB
+    %
+    
+    if mynumb ==1 % MATLAB --> MATHEMATICA
+        % 'e' substitution:
+        idx = regexp(mystr, '\de\d') + 1;
+        for m = numel(idx):-1:1, mystr = [mystr(1:idx(m)-1) '10^' mystr(idx(m)+1:end)]; end
+        % 'i' substitution:
+        idx = cell2mat(regexp(mystr, {'\di','\*i'}))  + 1;
+        for m = numel(idx):-1:1, mystr = [mystr(1:idx(m)-1) '*I' mystr(idx(m)+1:end)]; end
+        % 'pi' substitution:
+        idx = regexp(mystr,'\Wpi') + 1;
+        for m = numel(idx):-1:1, mystr(idx(m)) = 'P'; end
+        
+    else          % MATHEMATICA --> MATLAB
+        % 'i' substitution:
+        idx = cell2mat(regexp(mystr, {'\dI','\*I'}))  + 1;
+        for m = numel(idx):-1:1, mystr = [mystr(1:idx(m)-1) '*i' mystr(idx(m)+1:end)]; end
+        % 'pi' substitution:
+        idx = regexp(mystr,'\WPi') + 1;
+        for m = numel(idx):-1:1, mystr(idx(m)) = 'p'; end
+        
+    end
+        
+    funcList = {'sin','cos','exp','sqrt','abs'; ...
+        'Sin','Cos','Exp','Sqrt','Abs'};
+    if mynumb==1
+        par = {'(',')' ; '[',']'};
+    else par = {'[',']' ; '(',')'};
+    end
+    
+    for j=1:size(funcList,2)
+        idx = strfind(mystr,funcList{mynumb,j});
+        if ~isempty(idx)
+            for jj=numel(idx):-1:1
+                startIdx = idx(jj)+numel(funcList{mynumb,j}); % this is the index of the opening parenthesys
+                k = startIdx+1; openPar = 0;
+                while k~=0
+                    if k>numel(mystr), endIdx = k-1; break; end
+                    if mystr(k)==par{1,2} && openPar == 0
+                        endIdx = k;
+                        break
+                    elseif  mystr(k)==par{1,2} && openPar == 1
+                        openPar = openPar-1;
+                    elseif mystr(k)==par{1,1}
+                        openPar = openPar+1;
+                    end
+                    k = k+1;
+                end
+                % now startIdx e endIdx are the indexes of the parentheses
+                mystr(startIdx)= par{2,1};
+                mystr(endIdx)  = par{2,2};
+                temp = funcList;
+                temp(mynumb,:) = [];
+                mystr(idx(jj):idx(jj)+numel(temp{j})-1) = temp{j};
+            end
+        end
+    end
+    myout = mystr;
+    
+    end
+
+    function myout = preliminaryCheckSymb(mystr,mynumb)
+    % Performs a list of complex substitutions:
+    % - search for i (as in 2+4i) and converts in I.
+    % - search for pi (not inside strings) and converts in Pi.
+    %
+    % Parameter: mynumb = 1 MATLAB --> Symbolic (MUPAD),
+    %                   = 2 Symbolic (MUPAD) --> MATLAB
+    %
+    
+    if mynumb ==1 % MATLAB --> Symbolic (MUPAD)
+        % 'i' substitution:
+        idx = cell2mat(regexp(mystr, {'\di','\*i'}))  + 1;
+        for m = numel(idx):-1:1, mystr(idx(m)) = 'I'; end
+        % 'pi' substitution:
+        idx = regexp(mystr,'\Wpi') + 1;
+        for m = numel(idx):-1:1, mystr(idx(m)) = 'P'; mystr(idx(m)+1) = 'I';end
+        
+    else          % Symbolic (MUPAD) --> MATLAB
+        % 'i' substitution:
+        idx = cell2mat(regexp(mystr, {'\dI','\*I'}))  + 1;
+        % for m = numel(idx):-1:1, mystr = [mystr(1:idx-1) '*i' mystr(idx+1:end)]; end
+        mystr(idx)='i';
+        % 'pi' substitution:
+        idx = regexp(mystr,'PI\W*');
+        for m = numel(idx):-1:1, mystr(idx(m)) = 'p'; mystr(idx(m)+1) = 'i';end
+        
+    end
+        
+    myout = mystr;
+    
+    end
+
+
+end
\ No newline at end of file