我已经搜索了这个问题有很多答案,建议使用像arrayfun,bsxfun等功能。由于尺寸不匹配,我无法解决问题(可能是对MATLAB如何处理匿名函数句柄的基本误解)。
我有一个多个变量的通用函数句柄:
f = @(x,y) (some function of x, y)
启发式,我想定义一个新的函数句柄,如
g = @(x) sum(f(x,1:3))
更确切地说,以下内容正是我所需要的,但是为较大的数组(比如1:10而不是1:3)写出来是很乏味的:
g = @(x) f(x,1)+f(x,2)+f(x,3)
我试过像
这样的东西g = @(x) sum(arrayfun(@(y) f(x,y), 1:3))
但是只要x的大小超过1x1,这就不起作用。
提前致谢。
答案 0 :(得分:2)
假设您无法将f
的定义更改为更适合矢量,可以通过指定non-uniform output并将输出单元格数组转换为矩阵来使用上一个解决方案:
g = @(x) sum(cell2mat(arrayfun(@(y) f(x,y), 1:3,'UniformOutput',false)),2);
如果f(x,y)
输出列向量并且您希望将它们相加在一起,这应该可以正常工作。对于行向量,您可以使用
g = @(x) sum(cell2mat(arrayfun(@(y) f(x,y), 1:3,'UniformOutput',false).'));
如果数组的维度更高,我实际上认为函数累加器会更快更容易。例如,考虑(非常简单)函数:
function acc = accumfun(f,y)
acc = f(y(1));
for k = 2:numel(y)
acc = acc + f(y(k));
end
end
然后,你可以制作单行
g = @(x) accumfun(@(y) f(x,y),y);