2009-12-15 6 views
14

MATLAB에서 디버깅 할 때 진단 인쇄에 익명 함수를 사용합니다. 예를 들면, "이 중얼"로 disp([])를 사용MATLAB에서 "빈"익명 함수를 만드는 방법은 무엇입니까?

debug_disp = @(str) disp(str); 
debug_disp('Something is up.') 
... 
debug_disp = @(str) disp([]); 
% diagnostics are now hidden 

나에게 조금 더러운 것 같습니다; 거기에 더 나은 옵션이 있습니까? 명백한 (?) 방법이 작동하지 않습니다.

debug_disp = @(str) ; 

이것은 아마도 진단 인쇄뿐만 아니라 다른 기능적 언어 응용 프로그램에 유용 할 수 있습니다. 당신은 단순히 익명 함수의 본문을 대체 할 "하지 않는다 - 아무것도"명령을 찾고 있다면

답변

13

당신은 당신의 코드베이스에 정기적 아무것도 실시하지 않는 기능을 추가 할 수보십시오.

function NOP(varargin) 
%NOP Do nothing 
% 
% NOP(...) 
% 
% A do-nothing function for use as a placeholder when working with callbacks 
% or function handles. 

% Intentionally does nothing 

그런 다음 아무 것도 처리하지 않으려는 익명의 함수 대신 함수 핸들을 사용할 수 있습니다.

debug_disp = @NOP; 

가 지금은 DISP에 대한 잘못된 입력을 잡고 대신, 당신은 아무것도 할 의도가 명시적인 것을 만드는, 다소 자기 설명 적이다(). 소스 코드에서 볼 수 있듯이 디버거에서 함수 핸들을 포함하는 변수를 검사하면 익명 핸들보다 읽기 쉽기 때문에 "@NOP"으로 표시됩니다. 그리고 NOP 발신자 목록을보고 "프로필 보고서"출력에 누락 된 모든 작업 목록을 가져올 수 있습니다.

퇴화 된 경우에는 아무 것도하지 않고 반환하는 Matlab의 기본 제공 @deal을 사용할 수도 있습니다.

+0

나는이 접근법을 가장 좋아합니다. 참으로 그것을하는 가장 청결한 방법이다. –

+4

내 컴퓨터에서이 방법은 내가 시도한 두 가지 버전을 제외한 모든 버전보다 빠릅니다. handle이'handle = @ NOP' 일 때 handle()에 대한 1 백만 건의 호출은 7.09 초가 필요합니다. 'handle = @() [];'은 23.2 초가 필요합니다. 객체 생성의 오버 헤드 때문에 이것이라고 상상해보십시오. 'handle = @() drawnow ('update');'3.37 초가 필요합니다. 'handle = @() disp ([])'와'handle = @() disp ('');는 9.71 초에 묶여있었습니다. 가장 빠른 함수는'handle = @() (1);'이고 0.775 초의 시간이다. 그러나 해당 호출은 세미콜론으로 끝나야합니다. – Eponymous

+2

Oops'handle = @() drawnow ('update');는 100 만 건의 호출에 34.0 초가 걸렸습니다. 나는 우연히 1000000을 타이핑 할 때 0을 버렸다. 그건 그렇고, 그것은 여전히 ​​handle = @() drawnow;보다 훨씬 빠르며 187 초가 걸린다. – Eponymous

3

, 난 아마 DRAWNOW와 함께 가고 싶어요 :

debug_disp = @(str) drawnow; 

이 단순히 이벤트 큐를 플러시 것 텍스트를 표시하는 대신 그래픽을 업데이트하십시오.

+1

열려있는 그래픽 창이있는 경우'drawnow()'이벤트의 성능이 저하됩니다. – shabbychef

+0

@shabbychef : 그래픽을 업데이트하고 싶지 않다면'drawnow ('UPDATE')'를 사용할 수 있습니다. – gnovice

+1

@gnovice :'drawnow ('update')'문자열에 소문자를 사용하는 것이 중요합니다. 그렇지 않으면 Matlab이 "알 수없는 명령 옵션"에 대해 불평합니다 – Eponymous

10

disp([]) 또는 disp('')이 완벽하게 받아 들일 수 있다고 생각합니다. 아무것도 반환하지 않으며 부작용이 없습니다.

+0

이것을'@ (varargin) disp ('')'로 해석했습니다. 가장 간결하고 무의미한 기능 (필자가 여러 입력을 허용 함). – sage

3

여기에 아무것도없는 익명 기능이 있습니다. 아무것도 수행하지 않고 그냥 무시할 수있는 빈 배열을 반환합니다. 그 뒤에는 세미콜론을 넣어 disp를 억제해야합니다.

debug_disp = @(str) []; 

disp ([])도 제대로 작동해야합니다. 어떤 스타일이든 좋아합니다.

2

debug_disp = @(str)(1);

+0

덧글 [@Andrew Janke] (http://stackoverflow.com/questions/1904972/how-do-i-make-an-empty-anonymous-function-in-matlab/1907943#1907943) 또한 여기에 적용됩니다. 이렇게하면,'debug_disp '에 대한 모든 호출은 세미콜론으로 끝나야합니다. 그렇지 않으면 MATLAB은'ans = 1'을 표시합니다 :-(. –

관련 문제