2014-10-16 10 views
1

Matlab R2012b에서 의문 난 오류가 발생했습니다. 데이터 유형 인 변수 이름이 이상한 동작을 보이는 것 같습니다. 이 작은 예제를 참조하십시오 : 예상대로함수에서 스크립트 실행 중 퍼즐 오류가 발생했습니다.

function [] = test1() 
dataset = 1; 

if dataset ~= 0 
    disp hello 
end 

end 

test1()의 호출은, 출력 hello 생산하고 있습니다. 이제 내 함수에 dataset 값을 설정하는 대신 스크립트를 실행합니다. - 나는 그것이 알고

Undefined function 'ne' for input arguments of type 'dataset'. 
Error in test2 (line 4) 
if dataset ~= 0 

가 (변수가 dataset라는 이름의 용서 : 나는 test2()를 호출 할 때이 오류가 지금

dataset=1; 

: myscript.m

function [] = test2() 
myscript; 

if dataset ~= 0 
    disp hello 
end 

end 

한 라인을 가지고 또한 데이터 유형의 이름, 그리고 그것은 내가 실행 중이던 코드에 들어 왔습니다.) 따라서 test2에있는 것처럼 보이면 Matlab은 빈을 생성합니다 변수가 dataset 인 대신개체를 사용하십시오. 또한이 동작은 함수 본문 대신 스크립트에서 값을 설정할 때만 나타납니다. 더욱 이상한 것은 할 수 있다는 것입니다.

>> dbstop in test2 at 4 % line of if statement 
>> test2() 
K>> dataset 
dataset = 
     1.00 
K>> dataset ~= 0 
ans = 
1 
K>> if dataset ~= 0, disp hello; end 
hello 
K>> dbcont 

나는 같은 오류가 발생합니다! 디버깅 모드에서는 오류가 표시되지 않지만 정상적으로 실행됩니다.

누구든지 이것을 재현 할 수 있습니까? 여기서 무슨 일이 일어나고있는거야?

+0

요약하면 문제는'dataset'은 함수이고 입력 매개 변수없이 실행하면 데이터 셋 객체가 생성된다는 것입니다. 함수 내에서 값을 할당하면 MATLAB은이를 기억합니다. 별도의 스크립트에서이를 수행하면 MATLAB은 먼저 함수를 실행합니다. – MeMyselfAndI

+0

Matlab은 함수에서 할당되었지만 별도의 스크립트에서 할당 된 것을 기억하는 이유는 무엇입니까? 스크립트를 실행하는 것이 코드의 복사 붙여 넣기와 같다고 생각했습니다. 또한 왜 정수 값은 디버깅 모드에서 나타나지만 정상 실행에서는 나타나지 않을까요? –

+1

나는 이제 모든 세부 사항을 말하지 않아도되지만 이것은 MATLAB의 파싱 순서와 관련이있다. – MeMyselfAndI

답변

5

MATLAB 온라인 도움말에는이 문제를 다루는 일부 페이지가 있습니다. Variables NamesLoading Variables within a Function이 가장 적합합니다.

MATLAB은 컴파일 시간에 이름을 해결하는 방법에 대해 설명 명시 페이지가 없지만, Variables Names 페이지의 맨 아래에 작은 재미있는 이야기가있다 : "어떤 경우에는, load 또는 eval 함수와 같은 이름이 변수를 추가 이러한 변수는 load 또는 eval에 대한 호출하기 전에 함수 작업 공간에서하지 않는 한. 는 MATLAB 파서는 함수 이름으로 변수 이름을 해석합니다. "즉

, 파서가에 명시 적 할당을 발견하면 이름이 다른 존재하는 객체와 같은 변수 t 그는 로컬 정의가 우선합니다. test2()에는 변수 dataset에 대한 명시적인 지정이 없습니다. 따라서 파일을 컴파일 할 때 파서는 dataset을 클래스 생성자로 해석합니다 (파서가 실행되지 않거나 함수에 myscript을 인라인하기 때문에). dataset라는 변수는 함수의 작업 공간으로 1을 poofed 된 경우에도 실행시 다음

은 여전히 ​​실행되고있는 해석 코드는 클래스 생성자와 관련된 if -statement에서 dataset 기호가 있습니다.

필요한 경우 외부 파일에서 변수 이름 을 계속로드 할 수 있지만 함수 호출을 통해 명시 적으로 할당해야합니다.예를 들어

dataset = initialize(); 

이제 파서 dataset 함수 initialize 일부 임의 출력하고 모두 잘 것이라고 알 수있다. 사실 initializedataset 변수에 dataset 생성자를 반환 할 수 있습니다. (적어도 내가 읽은 자신의 블로그의 일부에) 변수가 명시 적으로 할당하지 않고 정의


1, MATLAB 사람들이 'poofing'를 불렀다. load을 출력 인수없이 사용하고 eval을 사용하고 단순히 스크립트 (함수가 아닌)를 실행하면 모든 변수가 작업 영역에 들어갑니다. 변수 이름이 컴파일시에 다른 사용중인 기호와 충돌하지 않는 한 이것은 잘 작동합니다.

관련 문제