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
试试这个。
在 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