2013-06-14 2 views
3

내가 함수 정의 (테스트 코드)의 다음 조각 한 "정적 작업 공간에"C를 : 나는 내 일부 중첩 된 기능을 기본적으로matlab에 "오류 assignin 사용 : 시도를 추가하는"

function [X,Y,Z] = test(x,y,z) 

syms a b c; 
a = b + c; % This is where it gets wrong 

X=x; 
Y=y; 
Z=z; 

keyboard 

% nested functions 
    function y = fun1(t,x) 
     y=t+x; 
    end 

    function res = bvpbc(y0,yT) 
     res= y0+yT; 
    end 

end 

test 함수에서 심볼릭 변수 a, bc을 선언했습니다. 내가

test(1,1,1)

를 입력하여 기능을 실행할 때, 거기에 항상이 오류 메시지입니다 :

Error using assignin 
Attempt to add "b" to a static workspace. 
See MATLAB Programming, Restrictions on Assigning to 
Variables for details. 

Error in syms (line 66) 
     assignin('caller',x,sym(x)); 

Error in test (line 3) 
    syms a b c; 

상징적 인 선언에 뭔가 문제가 될 것 같다,하지만 난 왜 이해가 안 돼요 . 어떻게 해결할 수 있습니까?

감사합니다.

편집 : 또한 두 중첩 된 함수를 제거 할 때마다 test 함수는 정상적으로 작동합니다.

답변

2

다음 최소한의 작업 예제는 문제를 재현하고, Andrew Janke이 코멘트에 설명으로, 버그가 아닙니다 :

function foo 
syms A 

    function nested 
    end 

end 

가 작업 공간에 상징적 인 변수의 명시 적 할당으로 해결할 수 있습니다 :

A = sym('A'); 
+3

이것은 Symbolic 항목이 도구 상자로 구현되는 방식과 Matlab 구문 자체가 아닌 이상한 결과입니다. 'syms A '는 정적 변수 선언처럼 보일 수도 있지만 그렇지 않습니다. 그것은 단지 일반적인 함수 호출입니다. 그것은 구문과 같이 보이기 위해 Matlab의 "command"호출 스타일을 사용하지만 실제로는'syms ('a', 'b', 'c')와 같습니다. 그리고 중첩 된 함수는 작업 공간을 정적으로 만든다. 그래서'syms' 함수가'assignin'을 사용하여 그것의 구현에서하는 vars를 동적으로 추가 할 수 없다. –

+3

'syms a b c'도 호출하기 전에 모든 변수를'[a, b, c] = deal ([]);로 미리 할당하면됩니다. 더 간결해질 수도 있습니다. –

+0

@AndrewJanke 감사합니다. 아주 좋은 의견입니다. – Oleg