MATLAB 中函数数组的矢量化或单行求值
Vectorized or single line evaluation of function array in MATLAB
在 previous question 中,一位用户询问了有关迭代匿名函数元胞数组的问题。我想知道是否有一种方法可以在不显式使用 for
循环的情况下评估一组函数。
例如,以下代码创建了一个(简单)函数数组,计算它们的固定值并存储结果:
fcnList = {@(x) (x+1), @(x) (x+2)};
a = 2;
for i = 1:numel(fcnList)
y(i) = fcnList{i}(a);
end
有没有不用循环的方法?
对于您的示例,您可以使用 cellfun 函数执行以下操作:
fcnList = {@(x) (x+1), @(x) (x+2)};
a = 2;
cellfun(@(func) func(a),fcnList)
ans =
3 4
我在其中创建了一个名为 func
的句柄,它接受来自 fcnList
变量的函数作为输入。然后针对 a
评估每个函数。
如果您需要传递矢量而不是标量,例如 b
,您需要将 'UniformOutput'
选项设置为 false
:
b=[3 4]
fcnList = {@(x) (x+1), @(x) (x+2)};
cellfun(@(func) func(b),fcnList,'UniformOutput',false)
ans =
{
[1,1] =
4 5
[1,2] =
5 6
}
要避免 for
循环或 cellfun
(即 more or less the same as a loop),您可以定义一个 单一函数 和 向量输出:
fcn = @(x) [x+1, x+2];
然后 fcn(a)
给你一个包含结果的向量:
>> fcn = @(x) [x+1, x+2];
>> a = 2;
>> fcn(a)
ans =
3 4
如果每个原始函数的结果大小不同,您可以使用 元胞数组输出定义单个函数:
>> fcn = @(x) {x+1, [x+2; x+3]};
>> a = 2;
>> x = fcn(a)
x =
[3] [2x1 double]
>> celldisp(x)
x{1} =
3
x{2} =
4
5
在 previous question 中,一位用户询问了有关迭代匿名函数元胞数组的问题。我想知道是否有一种方法可以在不显式使用 for
循环的情况下评估一组函数。
例如,以下代码创建了一个(简单)函数数组,计算它们的固定值并存储结果:
fcnList = {@(x) (x+1), @(x) (x+2)};
a = 2;
for i = 1:numel(fcnList)
y(i) = fcnList{i}(a);
end
有没有不用循环的方法?
对于您的示例,您可以使用 cellfun 函数执行以下操作:
fcnList = {@(x) (x+1), @(x) (x+2)};
a = 2;
cellfun(@(func) func(a),fcnList)
ans =
3 4
我在其中创建了一个名为 func
的句柄,它接受来自 fcnList
变量的函数作为输入。然后针对 a
评估每个函数。
如果您需要传递矢量而不是标量,例如 b
,您需要将 'UniformOutput'
选项设置为 false
:
b=[3 4]
fcnList = {@(x) (x+1), @(x) (x+2)};
cellfun(@(func) func(b),fcnList,'UniformOutput',false)
ans =
{
[1,1] =
4 5
[1,2] =
5 6
}
要避免 for
循环或 cellfun
(即 more or less the same as a loop),您可以定义一个 单一函数 和 向量输出:
fcn = @(x) [x+1, x+2];
然后 fcn(a)
给你一个包含结果的向量:
>> fcn = @(x) [x+1, x+2];
>> a = 2;
>> fcn(a)
ans =
3 4
如果每个原始函数的结果大小不同,您可以使用 元胞数组输出定义单个函数:
>> fcn = @(x) {x+1, [x+2; x+3]};
>> a = 2;
>> x = fcn(a)
x =
[3] [2x1 double]
>> celldisp(x)
x{1} =
3
x{2} =
4
5