试试这个。
在MATLAB R2014b中,使用以下代码创建一个新函数:
function f1 = fhandle_test(x,y)
f1 = figure;
scatter(x,y)
func = @(x) disp(x);
save('blob.mat','func')
end
现在用一些随机向量调用函数:
fhandle_test(rand(1,5),rand(1,5))
当我这样做时,我收到此警告信息
Warning: Figure is saved in blob.mat. Loading this file recreates and displays the figure and its
contents. Refer to save for more information.
> In fhandle_test at 7
果然,图形对象保存在MAT文件中,并在加载文件时恢复图形。据我所知,只有当我保存函数句柄或函数句柄的单元格数组时才会发生这种情况,并且只有在函数内部发生这种情况时才会发生。
现在再试一次,但是这次更改了函数,所以figure()的输出没有分配给变量:
function fhandle_test(x,y)
figure;
scatter(x,y)
func = @(x) disp(x);
save('blob.mat','func')
end
这次没有警告。
这里发生了什么,除了在保存之前删除数字句柄之外,还有什么方法可以阻止它吗?我不希望图形对象保存在MAT文件中,我需要句柄,我的函数正在返回它们。我还希望避免一些丑陋的黑客,我必须搜索对象空间并在保存后将图形对象分配给句柄。
答案 0 :(得分:5)
这是因为当您将匿名函数保存到文件时,匿名函数的工作区 也保存到文件中。本地函数的工作空间与匿名函数的工作空间共享,因此本地函数(包括图形句柄)中定义的任何变量也会保存到文件中。
这背后的基本原理是,在匿名函数中使用局部变量是完全合法的。
function myfunc(x)
y = 2;
func = @(x)x+y;
save('test.mat', 'func')
end
在这种情况下,您需要在文件中存储y
,以便在加载时能够正确执行匿名函数。遗憾的是,MATLAB实际上并没有检查匿名函数来识别使用哪些变量,因此它只是将所有内容保存在本地函数工作区中(这就是为什么你会看到你所做的行为)。
我们可以使用functions
函数验证是否是这种情况,以获取有关匿名函数的信息。
function fhandle_test(x,y)
f1 = figure;
scatter(x,y)
func = @(x) disp(x);
% Get information on workspace of func
F = functions(func);
celldisp(F.workspace)
save('blob.mat','func')
end
这将产生
ans{1} =
struct with no fields.
ans{2} =
f1: [1x1 Figure]
x: 1
y: 2
您可以验证图形句柄是否在匿名函数工作区内,因此将被保存。
一个可能的解决方法(如果您确实需要保存匿名函数)是将匿名函数放在另一个函数中,其中唯一的局部变量是您实际要保存到文件的那些变量
function fhandle_test(x,y)
f = figure;
scatter(x,y)
otherfunc(x);
end
function otherfunc(x)
func = @(x)disp(x);
save('blob.mat', 'func');
end