2013-09-26 1 views
1

데이터 블록에로드 된 GUI를 가진 스크립트가 있고 lsqnonlin을 사용하여 데이터의 각 행에 비선형 적합을 수행합니다. 모델 함수는 반복 사이에 변화하지 않는 부수적 인 계산 (가중치 함수, 테이블 조회 등)을 필요로하기 때문에 처음부터 계산하고 영구 변수에 저장합니다. 여태까지는 그런대로 잘됐다.작업 영역 B에서 작업 영역 A의 영구 변수를 지울 수 있습니까?

그러나 일단 GUI로 제어를 되돌리고 다음 데이터 세트에 맞추기를 원한다면,이 영구 변수는 여전히 존재하며 다음 데이터 세트에는 적합하지 않을 수 있습니다. 필자는 피팅 함수에 플래그를 전달하여 제거할지 여부를 알려 줬습니다. 내 현재 코드는 (매우 간단)이 같은 같습니다

constants.firstRun = true; 
constants.otherStuff = [other stuff I need for fit]; 
for k = 1:K 
    data = load(dataFile(k)) 
    [N,M] = size(data); 
    if k == 1 
     normalizedIndex = linspace(0,1,N); 
    end 
    for m = 1:M 
     dataToFit = data(:,m) 
     constants.dataToFit = dataToFit; 
     if k == 1 && m == 1 
      Ao = estimateStartingParameters(normalizedIndex,dataToFit); 
     else 
      Ao = A; 
     end 
     nlFitFun = @(ao) modelFunction(ao,normalizedIndex,constants); 
     A = lsqnonlin(nlFitFun,Ao); 
     % do things with A like calculate, plot, save etc. 
     constants.firstRun = false; 
    end 
end 

을 다음 모델 기능은, 그래서 여기

function Y = modelFunction(ao,normalizedIndex,constants) 
persistent Z 

if constants.firstRun 
    Z = longCalculation(constants.otherStuff); 
end 

X = calculation(ao,Z,normalizedIndex); 
Y = fullModel(ao,X,constants) - constants.dataToFit; 

같은 문제를 보이는 최초의 착용감, constants.firstRun 항상 사실이다 항상은 설정되기 전에 Z을 계산합니다.

질문은 주요 스크립트에서 영구 변수를 지우는 함수에 도달하는 방법이 있습니까? 필자가 생각한 또 다른 옵션은 constants 구조 변수에 영구 변수를 추가하는 것이지만 Z은 큽니다 (실제로는 여러 개의 영구 변수가 있습니다). 함수에 큰 변수를 전달할 때 메모리 또는 기타 오버 헤드 문제가 있습니까? 그 문제에 대해, 매번 함수에 변수를 전달하는 대신 영구 변수를 사용하여 실제로 무엇인가 얻는가?

답변

3

clear을 살펴보십시오. 함수 이름을 전달하면 함수 내에서 모든 영구 변수가 다시 초기화됩니다.

+0

이것은 OP가 필요로하는 것입니다. 너는 나를 때렸다. :) – chappjc

+1

그게 효과가! 내 방어에서, 나는 2013a를 가지고 있고 'clear'에 대한 도움말 파일은 이것에 관해 아무 것도 말하지 않는다. "name이 함수 이름이면, clear name은 함수의 모든 영구 변수를 다시 초기화합니다." 2013b 도움말 파일이 처음입니다. – craigim