- 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/
Github:https://github.com/jjvang/PassIntentDemo 我一直在关注有关按 Intent 传递对象的教程:https://www.javacodegeeks.c
我有一个 View ,其中包含自动生成的 text 类型的 input 框。当我单击“通过电子邮件发送结果”按钮时,代码会将您带到 CalculatedResults Controller 中的 Em
我有一个基本的docker镜像,我将以此为基础构建自己的镜像。我没有基础镜像的Dockerfile。 基本上,基本镜像使用两个--env arg,一个接受其许可证,一个选择在容器中激活哪个框架。我可以
假设我想计算 2^n 的总和,n 范围从 0 到 100。我可以编写以下内容: seq { 0 .. 100 } |> Seq.sumBy ((**) 2I) 但是,这与 (*) 或其他运算符/函数不
我有这个网址: http://www.example.com/get_url.php?ID=100&Link=http://www.test.com/page.php?l=1&m=7 当我打印 $_G
我想将 window.URL.createObjectURL(file) 创建的地址传递给 dancer.js 但我得到 GET blob:http%3A//localhost/b847c5cd-aa
我想知道如何将 typedef 传递给函数。例如: typedef int box[3][3]; box empty, *board[3][3]; 我如何将 board 传递给函数?我
我正在将一些代码从我的 Controller 移动到核心数据应用程序中的模型。 我编写了一个方法,该方法为我定期发出的特定获取请求返回 NSManagedObjectID。 + (NSManagedO
为什么我不能将类型化数组传递到采用 any[] 的函数/构造函数中? typedArray = new MyType[ ... ]; items = new ko.observableArray(ty
我是一名新的 Web 开发人员,正在学习 html5 和 javascript。 我有一个带有“选项卡”的网页,可以使网页的某些部分消失并重新出现。 链接如下: HOME 和 JavaScript 函
我试图将对函数的引用作为参数传递 很难解释 我会写一些伪代码示例 (calling function) function(hello()); function(pass) { if this =
我在尝试调用我正在创建的 C# 项目中的函数时遇到以下错误: System.Runtime.InteropServices.COMException: Operation is not allowed
使用 ksh。尝试重用当前脚本而不修改它,基本上可以归结为如下内容: `expr 5 $1 $2` 如何将乘法命令 (*) 作为参数 $1 传递? 我首先尝试使用“*”,甚至是\*,但没有用。我尝试
我一直在研究“Play for Java”这本书,这本书非常棒。我对 Java 还是很陌生,但我一直在关注这些示例,我有点卡在第 3 章上了。可以在此处找到代码:Play for Java on Gi
我知道 Javascript 中的对象是通过引用复制/传递的。但是函数呢? 当我跳到一些令人困惑的地方时,我正在尝试这段代码。这是代码片段: x = function() { console.log(
我希望能够像这样传递参数: fn(a>=b) or fn(a!=b) 我在 DjangoORM 和 SQLAlchemy 中看到了这种行为,但我不知道如何实现它。 最佳答案 ORM 使用 specia
在我的 Angular 项目中,我最近将 rxjs 升级到版本 6。现在,来自 npm 的模块(在 node_modules 文件夹内)由于一些破坏性更改而失败(旧的进口不再有效)。我为我的代码调整了
这个问题在这里已经有了答案: The issue of * in Command line argument (6 个答案) 关闭 3 年前。 我正在编写一个关于反向波兰表示法的 C 程序,它通过命
$(document).ready(function() { function GetDeals() { alert($(this).attr("id")); } $('.filter
下面是一个例子: 复制代码 代码如下: use strict; #这里是两个数组 my @i =('1','2','3'); my @j =('a','b','c'); &n
我是一名优秀的程序员,十分优秀!