2011-01-12 6 views
3

을 설계하는 것은 :MATLAB은 :는 "따뜻한 시작"나는 현재이 단계가 MATLAB에서 함수를 코딩하고있어

  1. 그것은 몇 가지 데이터를 처리
  2. 이 수행하는 처리 된 데이터에 대한 몇 가지 계산

함수를 사용하여 일련의 실험을 실행합니다. 여기서 2 단계에서 계산 방법을 조정할 수 있습니다.

큰 데이터 세트 및 데이터 처리 단계로 작업하는 방법을 볼 때마다 시간이 좀 걸립니다. 그러나 어쨌든 함수에서 "웜 시작"코드가 있는지 궁금합니다.

즉, 어쨌든 1 단계 이후에 수행 한 모든 진행 상황을 저장합니다. 따라서 두 번째 또는 세 번째 기능을 실행하면 1 단계를 건너 뛸 수 있고 오른쪽으로 이동합니다. 2)?

편집 : 제안 해 주셔서 감사합니다. 이 작업을 수행하는 방법은 여러 가지가 있습니다. Kitsune의 제안이 내 상황에 가장 적합하다고 생각합니다.

답변

2
function data = get_data(varargin) 
persistant stored_data 
if nargin>1 && any(strcmp(varargin,'--reload')) 
    stored_data=[]; 
end 
if isempty(stored_data) 
    stored_data = ...; 
end 

return stored_data; 
+1

+1 : 나는 일반적으로 두 부분으로 전체 코드를 깨는 (별도의 기능에 즉 초기 처리 및 보조 처리) 제안하지만, 할 의도는 (하나의 함수에 모든 것을 유지 [지속 변수]하는 경우 HTTP : //www.mathworks.com/help/techdoc/ref/persistent.html)은 확실히 가장 직접적인 해결책입니다. – gnovice

1

이 작업을 수행하는 한 가지 방법은 기능 대신 class을 작성하는 것입니다. 다음은 원하는만큼 확장 할 수있는 매우 기본적인 클래스를 정의합니다. 필자의 예에서는 함수의 두 단계를 runFirstSteprunSecondStep이라는 두 가지 함수로 분해해야합니다.

당신은

obj = myAwesomeClass; 
finalResults = obj.run(inputData); %# pass inputData for the first step if necessary 

중간 결과는 obj.intermediateResults에 저장됩니다로 실행 것, 그래서 다시 run를 호출하는 경우, 첫 번째 단계는 자동으로 생략됩니다.

원할 경우 intermediateResults 속성에 대해 집합과 가져 오기 기능을 추가 할 수 있습니다. set 함수는 함수에 쓸 때마다 결과를 디스크에 씁니다. get 함수는 호출 될 때마다 그리고 속성이 비어있을 때 중간 결과를로드하려고 시도합니다 (존재하는 경우).

classdef myAwesomeClass<handle 
properties 
    intermediateResults 
end 
methods 
    function finalResults = run(obj,inputData) 
     %# run accepts the object and runs both steps, if necessary 
     %# inputData is the data that is processed (if it's not loaded inside runFirstStep) 

     %# the first step only needs to run if there are no intermediate results 
     if isempty(obj.intermediateResults) 
      obj.intermediateResults = runFirstStep(inputData); 
     end 

     %# we always want to run the second step 
     finalResults = runSecondStep(obj.intermediateResults); 
    end 
end 
end 

물론, 당신은 또한뿐만 아니라 그것을 절약과 방법을 얻을/세트를 추가, 속성에 finalResults을 절약 할 수있다, 당신은 결과의 좋은 플롯을 생산하는 것 plot 방법을 추가 할 수 있습니다. 즉, 클래스를 사용하면 데이터와 상호 작용하는 데 필요한 모든 기능을 편리하게 수집 할 수 있습니다.

1

2 단계가 클래스의 일부인 경우 조나 스는 해결책을 제시 할 수 있습니다 (2 단계가 클래스의 메서드를 수정하려는 경우).

또 다른 일반적인 해결책은 함수가 1 단계를 수행하고 일부 데이터 구조 또는 배열 컬렉션을 반환하는 것입니다 (상황에 따라 적절 함). 필요할 경우이를 디스크에 저장할 수 있습니다. 그런 다음이 데이터 항목을 2 단계 기능에 전달합니다.

1

이런 종류의 문제에 대해 저는 두 단계를 두 개의 분리 된 기능으로 구분하고 싶습니다. 하나는 데이터를 생성하여 구조의 필드로 저장합니다. 나는이 구조를 저장한다. 마스터 스크립트는 필요한 경우 두 부분을 모두 실행합니다.한 번 사용

function mystruct = gen_data(...) 
    mystruct.field = ...; 
end 

는이 작업을 수행합니다 :

function result = process_data(mystruct, ...) 
    % do stuff 
end 

내가 보통을 통해 처리를 실행

mystruct = gen_data(...); 
save(mystruct, 'mystruct.mat'); 

주요 처리 함수는 인수의 하나로서이 구조체 소요 마스터 스크립트. 또한 작업 영역과 저장된 변수를 버전 관리에서 코드와 히스토리와 병행하여 보관하므로 특정 결과를 거꾸로 작업 할 수 있습니다.

if (~exist('mystruct')) 
    load('mystruct.mat'); 
end 
result = process_data(mystruct); 
관련 문제