데이터 블록에로드 된 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
은 큽니다 (실제로는 여러 개의 영구 변수가 있습니다). 함수에 큰 변수를 전달할 때 메모리 또는 기타 오버 헤드 문제가 있습니까? 그 문제에 대해, 매번 함수에 변수를 전달하는 대신 영구 변수를 사용하여 실제로 무엇인가 얻는가?
이것은 OP가 필요로하는 것입니다. 너는 나를 때렸다. :) – chappjc
그게 효과가! 내 방어에서, 나는 2013a를 가지고 있고 'clear'에 대한 도움말 파일은 이것에 관해 아무 것도 말하지 않는다. "name이 함수 이름이면, clear name은 함수의 모든 영구 변수를 다시 초기화합니다." 2013b 도움말 파일이 처음입니다. – craigim