- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想要一个函数(例如,fit 函数)返回一个匿名函数(通常存储在 struct
中),我可以保存并在以后使用。但是,传递 @func
倾向于传递函数指针而不是函数本身。 inline
函数是执行此操作的唯一方法吗?我想避免 inline
因为它非常慢。
如果这个问题不清楚,这里有一个有问题的代码示例:我在一些 PATH
testFunc.m
文件
%testFunc.m
function myfunc = testFunc()
myfunc = @(x) x.^2;
end
然后我将函数存储在 struct
中。 (我知道这真的应该是一个对象!)
>> mystruct = struct;
>> mystruct.func = testFunc()
>> mstruct.x = [1 2 3];
>> save('myfile.mat','mystruct')
>> mystruct.func(mystruct.x)
ans =
1 4 9
如果我随后移动 myfile.mat
或 testFunc.m
并加载 myfile.mat
,我将无法加载旧结构。相反,我收到错误:
>> cd 'otherdir'
>> load('../myfile.mat')
Warning: Could not find appropriate function on path
loading function handle PATH/testFunc.m>@(x)x.^2
我知道有问题,因为如果我检查函数
>> functions(mystruct.func)
ans =
function: '@(x)x.^2'
type: 'anonymous'
file: 'PATH/testFunc.m'
workspace: {2x1 cell}
有没有办法去除文件工作区信息? inline
函数是唯一的解决方案吗?
最佳答案
如果您希望匿名的函数仅限于根据它们的输入参数定义(例如 inline
函数),并且您可以 promise 在您的路径中保留一个函数,那么您可以制作“经过 sanitizer 的”匿名函数。
function out = sanitized_anon_fcn(str)
out = eval(str);
end
因此,在您的代码中,如果您想创建一个匿名函数,请执行此操作。
%testFunc2.m
function myfunc = testFunc2()
myfunc = sanitized_anon_fcn('@(x) x.^2');
end
只要 sanitized_anon_fcn.m 留在你的路径上,你就可以删除 testFunc2,保存的函数将继续工作。保存或加载时无需特殊处理。 Sanitized_anon_fcn
基本上像 inline
一样工作,但生成的函数与匿名函数一样快(因为它们是匿名函数)。在我的计算机上,R2011b 的速度差异约为 10 倍。
在一般情况下,函数实际上可能会使用其工作区中的变量,事情会变得更加棘手。
警告:这有点恶心,我不赞成在生产代码中使用它。但作为该语言如何工作的示例,我忍不住将其发布。
我认为您已经完成了 90%。但是您需要保留工作区信息而不是将其剥离,因为它可能有助于函数的运行。不要保存匿名函数句柄,而是获取您正在进行的 functions()
调用的输出并保存 that。
fcn = testFunc();
fcn_info = functions(fcn);
save willbreak.mat fcn
save blah.mat fcn_info
然后加载回来。您仍然会收到相同的警告,但现在警告仅适用于在顶级匿名函数的工作区内捕获的函数句柄。如果您的函数实际上没有引用它们(而且它不应该),您可以忽略警告,它会起作用。
s0 = load('willbreak.mat') % will warn and return unusable function
warning off MATLAB:dispatcher:UnresolvedFunctionHandle
s = load('blah.mat') % will warn, but the first-level function will be usable
warning on MATLAB:dispatcher:UnresolvedFunctionHandle
然后将它传递给类似于此函数的函数,这将使您的匿名函数在新工作区中起死回生,新工作区具有相同的工作区值,或多或少。
function out = reconstruct_anon_fcn(s)
for iWks = 1:numel(s.workspace)
wkspace = s.workspace{iWks};
varnames = fieldnames(wkspace);
for i = 1:numel(varnames)
tmp = wkspace.(varnames{i});
eval([varnames{i} ' = tmp;']);
end
end
fcn_str = s.function;
fcn = eval(fcn_str);
out = fcn;
end
在我们的例子中:
fcn = reconstruct_anon_fcn(s.fcn_info)
fcn(2) % and it works!
现在,所有加载的匿名函数都将声称来自这个新文件,但这无关紧要,因为匿名函数使用的只是工作区的快照状态,而不是封闭变量。如果工作区中存在计算实际使用的匿名函数句柄,您将收到一条相应的错误消息“未定义的函数句柄”。
这是一个 hack,但也许您可以将其扩展为相当稳健的东西。
关于matlab - 在matlab中传递和保存匿名函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9285725/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!