【发布时间】:2015-05-14 20:35:47
【问题描述】:
我正在尝试根据输入参数的数量为匿名函数生成参数字符串而不使用 for 循环。例如,如果 N=3,那么我想要一个这样的字符串
@(ax(1),ax(2),ax(3),ay(1),ay(2),ay(3))
我尝试使用 repmat('ax',1,N) 但我不知道如何交错 (i) 索引。
有什么想法吗?
除此之外:到目前为止,答案很好,上述问题已经解决。为了给那些想知道为什么的人提供一些直觉,我想这样做:我需要构造一个大小为 3000x3000 的非常大的矩阵匿名函数(雅可比行列式)。我最初使用Matlab操作jacobian和matlabFunction来构造匿名函数;但是,这很慢。相反,由于导数的封闭形式非常简单,我决定直接形成匿名函数。这是通过形成符号雅可比矩阵 J,然后使用 char(J{:})' 将其附加到上述 @() 字符串并使用 eval 来形成最终的匿名函数来完成的。这可能不是最优雅的解决方案,但我发现它比 jacobian/matlabFunction 组合运行得快得多,尤其是对于大 N(此外,新方法的结构允许并行进行评估)。
编辑:为了完整起见,匿名函数的参数字符串的正确形式应该是
@(ax1,ax2,ax3,ay1,ay2,ay3)
避免与索引相关的语法错误。
【问题讨论】:
-
使用字符串来做到这一点不是一个很好的解决方案。我怀疑您可能想改用
varargin。您想准确构建哪些匿名函数?其次:您在那里创建的语法在 MATLAB 中无效。 -
期待我的 Mentalist 徽章,我预测 OP 真的想要这样的东西:
f = @(ax, ay) ...,然后将通过f([a,b,c],[d,e,f])调用 -
感谢您尝试澄清。我仍然不明白答案如何解决您的问题。如果您在它们上使用
str2func,它们只会产生语法错误。 -
本着从符号导数构建快速函数的精神,我建议使用来自this answer 的概念。它可以生成漂亮的代码,并且速度就像您手动构建函数一样快。
-
@knedlsepp 谢谢!我会调查的。