2012-05-02 2 views
4

내 변수 중 하나 인 "주석"및 내장 된 MATLAB 함수 "주석"과 MATLAB 이름 충돌이있는 것 같습니다.MATLAB 이름 충돌 : "잘못된 인수 수"

내 함수에서 변수 주석이 들어있는 .mat 파일을로드하고 다른 함수의 인수로 사용하려고합니다. 지금

function test() 

    filenames = { 'file1.mat', 'file2.mat', 'file3.mat' }; 

    for i = 1:numel(filenames) 
     in_file = char(filenames{i}); 
     out_file = strrep(in_file, '.mat', '_out.mat'); 

     prepare(out_file); % do something with the out file 

     load(out_file); % contains one variable named "annotation" 
     which annotation % just to be sure 

     other_function(annotation); 
    end 
end 

function prepare(filename) 
    annotation = rand(25, 1); 
    save(filename); 
end 

function other_function(annotation) 
    whos % just a stub - see whether it has been called 
end 

을 내 기능에 나는 파일이 "주석"라는 이름의 변수를 포함 확신했다 준비 : 최소한의 작업 예는 다음과 같습니다. 나는 주요 기능의 루프를로드 할 때 "어떤"명령은 변수로 존재하지만 other_function의 호출에, MATLAB 함수 "주석"호출하려고 나에게 말한다 :

주석이 변수입니다 .

??? 오류 사용 ==> 14

 other_function(annotation); 

내가 변수 이름 "주석"을 사용하고 있기 때문에 나는 혼란 스러워요에서 71

충분하지 않은 입력 인수 ==에

오류> 시험에서 주석 내 프로그램의 여러 부분에서 함수 호출의 매개 변수로도 사용됩니다. 내가 상상할 수있는 유일한 설명은 MATLAB이 어떻게 든 내 코드를 사전 컴파일합니다. "컴파일 할 때"변수 "주석"이 보이지 않습니다. 그러나 런타임에 "which"명령의 출력에서 ​​볼 수있는 것처럼 발견됩니다.

도움이 될 것입니다. 미리 감사드립니다.

참고 : MATLAB 7.12.0 (R2011a)을 사용하고 있습니다.

+0

, 당신의 변수 annotation.Well의 이름을 변화 할 수있는 모든, 나는 주석을 볼 수 없습니다 귀하의 코드에서 변수로 선언했다. Matlab을 이해함에 따라 스크립트 언어이기 때문에 묻지 않고 모든 내용을 덮어 씁니다. 당신은 디버거로 throuhg 가서 "무엇"에서 주석 내부에 있는지 볼 수 있습니까? –

+0

디버거는 주석이 변수라고 말하고 디버거에'annotation'을 입력하면 오류없이 평가할 것입니다. – Richante

답변

0

이것은 조금 이상합니다! 나는 똑같은 것을 발견했다. 기본적으로, 작업 공간 변수는 내부 함수의 범위에 있어서는 안됩니다 (스크립트 내부에 있음).

load(out_file)을 수행하면 해당 파일의 내용이 작업 영역에로드됩니다. 그래서 그들은 범위에 있지 않아야한다고 믿습니다. 따라서 which(annotation)이 변수를 호출하지만 annotation이 범위를 벗어난 것은 놀랄 일이 아닙니다. (사실 Matlab은 범위에 변수를 넣는 것처럼 보입니다.)

annotation의 전처리에 대한 생각은 그럴듯하다고 생각합니다. 예를 들어, other_function(annotation)eval('other_function(annotation);')으로 바꾸면 작동합니다 (비록 내가 이어야한다고 말하지는 않지만 eval을 사용하십시오).

같은 것을 할 것입니다이 문제를 해결하는 가장 좋은 방법 :

data = load(out_file); 
annotation = data.annotation; 

그래서, 다음 구조체에 부하 out_file, 그리고 거기에서 변수에 액세스합니다.

+0

감사합니다. 좋은 생각입니다. 또한 변수 주석이 명시 적으로 선언 되었기 때문에 내 코드를 더 이해하기 쉽게 만듭니다. – Jenny

2

그것은 아름답게 애매한 문제입니다! Mathwork의 부분에서는 엉터리 디자인입니다. 나는 심지어 버그라고 부르며 그들이 동의 하는지를 흥미롭게 보았다.

짧은 답변 : load(out_file); 코드 위의 코드에 annnotation = 2; 줄을 추가하여이 문제를 "고칠 수 있습니다.또는 annotation = "roger"; 또는 annotation = false; 인 경우 명시 적으로 코드의 변수가되도록 강제하는 한 주석의 유형은 중요하지 않습니다.

작성한 코드에 명시 적으로 변수 annotation을 참조하지 않았습니다. annotation은 함수의 작업 공간에로드하는 matlab 파일의 변수 이름 일뿐입니다. 여하튼, 이것은 런타임 오류를 throw하지 않습니다, 그것은 단지 내가 버그를 호출 것이 잘못 작동하지만, MATLAB은 문서화 된 한계라고 말할 수 있습니다. http://www.mathworks.com/help/techdoc/matlab_prog/f4-39683.html#f4-75258에서 해당 설명서를보고 생각해보십시오. 이 문서는 중첩 된 함수에 적용되는 것으로 보인다. 명확하게 당신의 라인 other_function(annotation)which annotation과 똑같은 범위의 annotation을보아야합니다. (방금 테스트를했는데 annotation is a variable라고 쓰여 있음).

function test() 
    prepare('test.mat'); % writes i 
    load('test.mat'); % contains one variable named "annotation" 

    which annotation 
    other_function(annotation); 
end 

function prepare(filename) 
    annotation = 42; % the answer is 42 
    save(filename); 
end 

function other_function(poodle) 
    disp(poodle); 
end 

난 당신이 해당 페이지의 "보고서 버그"링크를 사용하여 http://www.mathworks.com/support/bugreports에 버그 리포트 제출이 초대 :

는 여기에 문제를 보여줍니다 최소한의 프로그램입니다! 원하지 않으시면 신고하겠습니다. 알려주세요.

+0

그 문제를 해결하는 방법에 대한 제안에 감사드립니다! 설명서에 중첩 된 "경우에 따라"익명 기능에 대해서만 이야기하는 것에 동의합니다. 또한, 최소한의 예제에서는 함수 준비가 하위 함수이지만, 문제를 발견 한 원래 코드에서 기본 함수라고 할 수 있습니다. 이 문제에 대한 버그 보고서를 제출하려했지만 불행히도 – Jenny

+0

이 문제에 대한 버그 보고서를 제출하려했지만 불행히도 Mathworks 사이트에서 허용하지 않습니다 (이전에이 문제가 있었는지, 브라우저 및 쿠키가 있는지 ...).). 그렇게 할 수 있다면 좋을 것이고이 버그를 따라갈 수있는 링크를 보내주십시오. – Jenny

+0

[버그 리포트] (http://www.mathworks.com/support/service_requests/Service_Request_Detail.do?ID=632255&filter=&sort=&statusorder=0&dateorder=0)를 제출했습니다. 내 이름은 **이지만 함수 호출은 지역 변수 대신 함수에 액세스합니다. ** – mwengler