How can I clear persistent variables from a function using only its handle?
조회 수: 1 (최근 30일)
이전 댓글 표시
For example, say I have a simple function, test1,
function test1 = test1(x,y)
persistent k
if isempty(k), k = sum(y); end
test1 = k*x*y;
which I call from another function, test0, within which I want to clear the persistent variable, k, in test1, for example,
function test0 = test0(x,y,fn)
clear fn
for i = 1:length(x)
test0 = fn(x(i),y);
end
using
test0(1,2,@test1)
But, of course, it doesn't work, with error
Reference to a cleared variable fn.
Error in test0 (line 4)
test0 = fn(x(i),y);
because the line
clear fn
doesn't do the job, for obvious reasons, but I don't know how to fix this.
Thanks in advance for your help.
댓글 수: 1
채택된 답변
추가 답변 (1개)
Steven Lord
2017년 9월 28일
Another approach would be for the function you created that uses a persistent variable to accept a special flag, one that isn't a normal data input, that tells it to clear the persistent variable.
function z = addXToY(x)
persistent y
if isempty(y)
y = 0;
end
if isequal(x, 'reset')
z = y;
y = 0;
else
y = y + x;
z = y;
end
Call it like:
>> z = addXToY(1)
z =
1
>> z = addXToY(2)
z =
3
>> z = addXToY(3)
z =
6
>> z = addXToY('reset')
z =
6
>> z = addXToY(4)
z =
4
>> z = addXToY(5)
z =
9
댓글 수: 2
Guillaume
2017년 9월 28일
As I said in my answer, a function that has state and special flags (that don't come with tab completion) would be better implemented as a class (that supports tab completion):
classdef myfunctionobject < handle
properties (access = private)
state;
end
methods
function this = myfunctionobject()
this.Reset();
end
function Reset(this))
this.state = 0;
end
function result = DoSomething(this, x, y)
this.state = this.state + 1;
result = x + this.state * y;
end
end
end
Used:
fn = myfunctionobject; %equivalent to setting the function handle
fn.Reset; %equivalent to the clear call
fn.Dosomething(x, y); %equivalent to calling the function handle
참고 항목
카테고리
Help Center 및 File Exchange에서 Function Creation에 대해 자세히 알아보기
제품
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!