Matlab - 为匿名函数动态生成字符串

时间:2015-03-12 15:34:15

标签: string matlab

我正在尝试根据输入参数的数量为匿名函数生成参数字符串,而不使用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)

避免与索引相关的语法错误。

3 个答案:

答案 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))'

最佳,