MATLAB R2014b 无需询问即可保存图形句柄

MATLAB R2014b saves figure handles without asking

试试这个。

在 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 文件中,我需要句柄,我的函数正在返回它们。我还希望避免一些丑陋的黑客攻击,我必须搜索对象 space 并在保存后将图形对象分配给句柄。

这是因为当你将匿名函数保存到文件时,匿名函数的工作区也会保存到文件中.局部函数的工作空间与匿名函数的工作空间共享,因此在局部函数中定义的任何变量(包括图形句柄)也会保存到文件中。

这背后的基本原理是您在匿名函数中使用局部变量是完全合法的。

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