一種可能的方式來做到這一點是將功能句柄保存到.mat
文件(使用-v7.3
標誌,以便它創建了一個容易修改的HDF5文件),修改struct
包含工作空間數據的文件內對於匿名函數(使用內置於MATLAB中的HDF5工具),然後再次從文件加載匿名函數。
這裏是一個小功能,這正是這麼做的(和它的工作原理相對簡單的變量類型)
function result = modifyfunc(f, varname, value)
% modifyfunc - Modify the workspace of an anonymous function
%
% INPUTS:
% f: Function Handle, Anonymous function to modify
% varname: String, Name of the variable to modify
% value: Data to replace the specified variable
% If the value is a struct, recursively modify the function handle
if isstruct(value)
fields = fieldnames(value);
result = f;
% Modify each field separately
for k = 1:numel(fields)
% Append the fieldname to the variable name and modify
name = [varname, '.', fields{k}];
result = modifyfunc(result, name, value.(fields{k}));
end
return;
end
% Write the anonymous function to an HDF5 file
fname = tempname;
save(fname, 'f', '-mat', '-v7.3');
% Replace any "." in the variable name with "/" to construct the HDF5 path
varname = strrep(varname, '.' , '/');
% Now modify the data in the file
h5write(fname, ['/#refs#/e/' varname], value);
% Load the modified function handle from the file
result = load(fname, '-mat');
result = result.f;
% Remove the temporary file
delete(fname);
end
而且你可以用它喜歡:
a = 1;
b = struct('field', 2);
f = @(x)disp(a + b.field + x);
f(10)
% 13
f2 = modifyfunc(f, 'a', 2);
f2(10)
% 14
f3 = modifyfunc(f2, 'b.field', 3);
f3(10)
% 15
b.field = 4;
f4 = modifyfunc(f3, 'b', b);
f4(10)
% 16
一些注意事項包括:
- 替換數據必須與原始數據大小相同
- 這依賴於.mat文件的格式,對於匿名函數完全沒有記錄,所以它可能會在將來的版本中失敗。
- 目前,該功能工作區中的變量不適用於
cell
數組。
對於溫和的附加安全邊界,您可以將結構字段另存爲一個mat文件(https://www.mathworks.com/help/matlab/matlab_env/save-load- and-delete-workspace-variables.html#bvdx_92-1)並重新加載。它仍然很髒,但仍然使用「功能」。 –