2016-11-07 1 views
2

MATLAB 기호식의 출력 순서를 제어 할 수 있습니까? 예를 들어기호식의 출력 순서 제어

:

f= 
x*y 

을하지만 난 좀하고 싶습니다 :

syms x y 
f=y*x 

MATLAB은 일반적으로 반환합니다 내가 MATLAB R2012b를 사용하고

f= 
y*x 

. 어떻게해야합니까?

NEW EDIT 2016년 11월 9일
내가이 어제 발견하고 나에게 이상한 것 같다
를 R2008a에서

%%feedback.m 
function H=feedback(G1,G2,key) 
if nargin==2 
    key=-1; 
end 
H=G1/(sym(1)-key*G1*G2); 
H=simple(H); 

%%matlab command window 
syms G1 G2 G3 G4 G5 G6 H1 H2 H3 H4 
c1=feedback(G4*G5,H3); 
c2=feedback(G2*G3,H2); 
c3=feedback(c1*c2,H4/G2/G5); 
G=feedback(c3*G1*G6,H1); 
pretty(G) 

MATLAB은 불행하게도

G= 
G3 G2 G4 G5 G1 G6/(1 + G2 G3 H2 + G4 G5 H3 + G4 G5 H3 G2 G3 H2 + G4 G3 H4 + G3 G2 G4 G5 G1 G6 H1) 

를 반환, 내 R2008a 아무튼 상징적 인 수학 도구 상자가 있습니다 (필자는 여러 번 재설치를 시도했지만 작동하지 않습니다). 그러므로 나는 그것이 사실인지를 확인할 수 없다. 나는 2008a가 그것을 만들 수 있다면, 왜 2012b를 할 수 없을 것이라고 생각합니다.
위의 질문에 도움이되기를 바랍니다.

+0

문제는 아니지만 왜 4,5 년 된 MATLAB 버전을 사용하고 있습니까? 그러면 더 이상 사용되지 않는 기능 및 최신 버전과의 호환성 문제가 발생할 것입니다. – Adriaan

+0

@Adriaan : 슬프게도 사실입니다. 정직하기 위해 나를 멀어지게하는 것은 도구의 현실입니다. MATLAB은 장기적인 지원을 염두에두고 제작되지 않았습니다. 마찬가지로, 모든 새로운 버전은 적어도 오래된 코드를 어기는 것들이있는 것처럼 보입니다. 때때로, 꽤 심하게. 대부분의 다른 언어는 최소한 버전간에 하위 호환성을 보장합니다. 이는 내 회사가 장기 지원을 필요로하는 프로젝트를 시작했기 때문에 MATLAB R2010a에서 여전히 많은 시간을 보냈던 이유 중 일부입니다.이 프로젝트는 최소 2 년 이상 R2010a로 완료되지 않습니다. –

+0

정렬 순서를 바꾸려면 찾은 대답을 참조하십시오. 좀 더 복잡한 일을하고 싶다면, 쉬운 방법이있을 거라 생각합니다. (어떤 해결책이 모든 가능한 상황에서 작동하도록 분명히 일반화되어야하므로). –

답변

0

확실하지.

allstrs = mupadmex(X.s,0); 
allstrs = strrep(allstrs,'MLVar',''); 
disp(allstrs); 
Xsym 개체이다

s는 그 private 속성이다 : 여기 관련 코드이다.

기능 mupadmex()은 이름에서 알 수 있듯이 MEX 바이너리입니다.

당신이 볼 수 있듯이
% MUPADMEX(STMT) executes STMT in MuPAD. STMT must be a string or cell 
% array of strings. A cell array is converted into a MuPAD matrix or array. 
% Y = MUPADMEX(STMT) executes STMT in MuPAD and returns the result as 
% sym object Y. STMT must be a string or cell array of strings. If STMT 
% is a cell Y is a string reference instead of a sym. 
% Y = MUPADMEX(FCN,ARG1,ARG2, ...) evaluates FCN(ARG1,ARG2,...). The inputs 
% must be strings. 
% Y = MUPADMEX(... ,0) returns Y as a string instead of a sym. 
% Y = MUPADMEX(REF ,1) adds REF to the garbage list. 
% Y = MUPADMEX(STMT,2) frees any garbage. 
% Y = MUPADMEX(VAL ,3) formats VAL as 'symr'. 
% Y = MUPADMEX(VAL ,4) formats VAL as 'symfl'. 
% Y = MUPADMEX(VAL ,5) toggles the trace feature. VAL must be 'on' or 'off'. 
% Y = MUPADMEX(STMT,6) resets MuPAD. 
% Y = MUPADMEX(VAL ,7) toggles the pretty-print feature. 
% Y = MUPADMEX(VAL ,8) sets the complex unit. VAL is 'I' or 'sqrtmone'. 
% Y = MUPADMEX(... ,9) returns Y as a logical instead of a sym. 
% Y = MUPADMEX(VAL ,10) toggles the synchronous evaluation mode (out-of-process kernel only). 
% Y = MUPADMEX(... ,11) returns Y as a string reference. 
% Y = MUPADMEX(VAL ,12) print out memory usage 
% Y = MUPADMEX(VAL ,13) toggles lazy evaluation mode 
% Y = MUPADMEX(VAL ,14) evaluates all the lazy statements 
% [Y,STATUS] = ... sets STATUS to 0 if the command completes without error 
% and otherwise sets STATUS to 1 and Y to the error string. 

, 그것에 대해 문자열을 포맷 아무것도 말한다 : 해당 M-코드는이 포함되어 있습니다. 하지만

function disp_sym(X) 

    str = evalc('X'); 
    str = regexp(str, '=', 'split'); 
    fml = strtrim(str{2}); 
    eq = str{1}; 

    fml = regexp(fml, '*', 'split'); 
    fml = fml(end:-1:1); 

    disp([eq '=' sprintf('%s*', fml{1:end-1}) fml{end}]); 

end 

:

  1. 당신은 도구 상자 코드
  2. 과 같은 디스플레이 래퍼 쓰기를 변경해야 할 것 :

    그래서, 짧은에, 당신은 다음과 같은 작업을 수행 할 수 그것은 지나치게 특수하고 휴대하기가 정말 쉽지 않습니다.

+0

나는 독창성을 좋아하지만,이 특정 디스플레이 래퍼는 모든 경우에 적용될 수도 있고 작동하지 않을 수도있는 예라고 생각한다. (마지막 줄에는 이미이 내용이 포함되어 있지만 명시 적 경고는 좋은 생각처럼 보일 것입니다.) - 테스트를 시도하지는 않았지만 시간 b와 같은 복잡한 표현이있을 때 일어나는 이상한 일들을 상상할 수 있습니다. –

+0

@DennisJaheruddin, 이것이 OP의 유스 케이스에만 해당됩니다. 충분하지 않을 수도 있습니다. 어쨌든, 나는이 경로에 대해 강력히 권고하지만, 어떤 경우에는 나쁜 조언 만이 가능한 조언입니다. –

+0

@Rody Oldenhuis : 도구 상자 코드를 변경하는 것이 위험 할 수 있으므로 두 번째 해결 방법을 선호합니다. 하지만 여전히 문제가 있습니다 : disp_sym 함수를 사용한 후에,이 함수는 역순으로 표현식을 표시하지만 MATLAB에 저장되는 변수는 없습니다. 원하는 것은 : (자체 정의 된) 함수를 사용한 후에, MATLAB은 sym 변수를 저장할 수 있습니다.이 변수의 값은 예를 들어 y * x입니다. 그게 가능한가 ?? –

0

실제로이 질문에 완전히 대답하는 것으로 보이는 an answer by @horchler이 발견되었습니다. 그것은 다른 질문에 대한 대답으로 주어졌지만. 나는 그것이 알파벳 당신의 방정식의 변수 이름의 ASCII 값을 기반으로 믿고


: 견적 블록에 내가 대답을 인용,하지만 난 그것을 넣어하지 않습니다

참고 가독성을 향상시키기 위해 . solve에 대한 documentation에 따라 sym/symvar은 출력 변수의 이름을 입력하지 않은 경우 수식을 구문 분석하는 데 사용됩니다. sym/symvar에 대한 도움말은 lexicographical order에 변수를 반환한다는 것을 나타냅니다. 알파벳 (symvar은이를 나타내지 만, setdiff을 호출함으로써 동일합니다.). solve.m의 실제 코드 (명령 창에 edit solve 입력)를보고 assignOutputs (R2012b의 190 행)이라는 하위 함수를 살펴보면 sort을 호출하고 주석이 있다는 것을 알 수 있습니다. 사전 식 순서.

R2012b (및 그 이전 일 가능성이 있음)에서는 설명서가 R2013a와 다른 점을 보였습니다. R2013a, this sentence is added에서 :

명시 적으로 독립 변수 vars을 지정하는 경우는, 다음 솔버는 솔루션을 반환하는 동일한 순서 를 사용합니다.

저는 여전히이 동작을 확인할 수 없으므로 R2012b를 실행하고 있습니다.이 R2012b에 적용하지만 내 R2010a에, 클래스 sym이 당신의 작은 기능을 표시 할 때 실행 (물론, 모든 sym 개체)되는 disp 방법을 경우

+0

나는 묻기 전에 이것을 읽었다. 나는 그것이 나의 질문과 관련이 있을지도 모른다는 것을 안다. 그러나 나는 아직도 그것을 이해할 수 없다. 우선, 나는 solve 함수를 사용하지 않았다. 위에서 언급 한 하위 함수를 보았지만 여전히 코드를 변경하는 방법을 모릅니다. 다른 사람을 위해, 비록 내가 그것을 재 작성하는 방법을 안다 할지라도, 나는 어떤 코드에 새로운 코드를 넣어야하는지 모른다. 또한 도구 상자 코드를 변경하면 위험 할 수 있습니다 ..... –

+0

@ Sam.X. sym/symvar에서 탐험을 시작할 것입니다. 코드가 접근 가능하다면 어딘가에 정렬을 뒤집을 수 있어야합니다. 그렇지 않으면 행운이 아닐 수도 있습니다. - 물론 기본 MATLAB 코드를 변경하면 예기치 않은 결과가 발생할 수 있으므로 자신의 책임하에 플레이하십시오. - 그냥 생각하지만'syms y x '를 사용하면 도움이됩니까? 또는'syms Bx Ay'를 마지막 경우에 사용하면 Ay을 y로 대체하고 Bx를 x로 대체하여 출력을 처리하기가 상대적으로 쉽습니다. –

+0

두 번째 솔루션의 경우 x '을 정의 할 수 없습니다. 오류는 다음과 같습니다. 유효한 변수 이름이 아닙니다. Bx와 Ay의 경우, 항상 f = Ay * Bx ..... orz를 반환 할 것입니다. 그리고 지금은 sym/symvar에서 탐험 중이며 많은 기능이 있다는 것을 발견했습니다. 보지 못했던 ..... ToT .... –