在MATLAB

时间:2016-01-15 18:54:19

标签: arrays matlab

我已经搜索了这个问题有很多答案,建议使用像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,这就不起作用。

提前致谢。

1 个答案:

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