我正在尝试根据输入参数的数量为匿名函数生成参数字符串,而不使用for循环。例如,如果N = 3,那么我想要一个读取
的字符串@(ax(1),ax(2),ax(3),ay(1),ay(2),ay(3))
我尝试使用repmat(' ax',1,N)但我无法弄清楚如何交织(i)索引。
有什么想法吗?
旁白:到目前为止,很好的答案,上述问题已经解决。为那些想知道为什么我想要这样做的人提供一些直觉:我需要构建一个3000x3000量级的非常大的矩阵匿名函数(Jacobian)。我最初使用matlab操作jacobian和matlabFunction来构造匿名函数;然而,这很慢。相反,由于导数的封闭形式非常简单,我决定直接形成匿名函数。这是通过形成符号雅可比矩阵J,然后使用char(J {:})'将其附加到上面的@()字符串来完成的。并使用eval形成最终的匿名函数。这可能不是最优雅的解决方案,但我发现它比jacobian / matlabFunction组合运行得快得多,特别是对于大N(此外,新方法的结构允许评估并行完成)。
编辑:为了完整起见,匿名函数的参数字符串的正确形式应为
@(ax1,ax2,ax3,ay1,ay2,ay3)
避免与索引相关的语法错误。
答案 0 :(得分:2)
我建议如下:
N = 3;
argumentString = [repmat('ax(%i),',1,N),repmat('ay(%i),',1,N)];
functionString = sprintf(['@(',argumentString(1:end-1),')'], 1:N, 1:N)
首先,为sprintf创建输入掩码(例如'ax(%i)'
),然后使用适当的数字填写该掩码以创建函数字符串。
注意:语法@(ax(1),...)
实际上不起作用。更有可能的是,您希望使用@()someFunction(ax(1),...)
,或者您尝试将多个输入参数传递给现有函数,在这种情况下,将输入存储在单元数组中并将函数调用为fun(axCell{:})
将起作用
答案 1 :(得分:1)
试试这个:
N = 3;
sx = strcat('ax(', arrayfun(@num2str, 1:N, 'uniformoutput', 0), '),');
sy = strcat('ay(', arrayfun(@num2str, 1:N, 'uniformoutput', 0), '),');
str = [sx{:} sy{:}];
str = ['@(' str(1:end-1) ')']
答案 2 :(得分:1)
解决方案是使用arrayfun
:
sx = strjoin(arrayfun(@(x) ['ax(' num2str(x) ')'], 1:3, 'UniformOutput', false), ',');
sy = strjoin(arrayfun(@(x) ['ay(' num2str(x) ')'], 1:3, 'UniformOutput', false), ',');
s = ['@(' sx ',' sy ')'];
包含
'@(ax(1),ax(2),ax(3),ay(1),ay(2),ay(3))'
最佳,