当数组的每一行都是输入时,arrayfun

时间:2013-08-13 02:22:57

标签: matlab

我的情况是,我想通过一个函数来映射标量数组A,句柄fun向行向量发送行向量,以获取B,这样{ {1}}。

我能想到的最合理的解决方案如下:

B(i,:) = fun(A(i,:))

然而,向细胞和背部的转换似乎有点过分(并且在计算上非常昂贵)。我也不清楚为什么cellfun会抱怨输出不均匀。是否有更有效的方式跳到脑海?

4 个答案:

答案 0 :(得分:3)

您可以使用bsxfun完全不使用单元格数组。

使用Marcin的示例数据和函数:

A =[ 0.5669    0.4315    0.4515    0.7664    0.5923; ...
     0.8337    0.7317    0.4898    0.2535    0.7506; ...
     0.3321    0.5424    0.4585    0.8004    0.9564];

fun = @(x,y) x*2;
B= bsxfun(fun,A,1);

B =

    1.1338    0.8630    0.9030    1.5328    1.1846
    1.6674    1.4634    0.9796    0.5070    1.5012
    0.6642    1.0848    0.9170    1.6008    1.9128

编辑:

正如Eitan所说,上面的乐趣可能需要成为你的“真实”匿名函数的包装器,所以将我的解决方案显示为更完整:

fun = @(x) x *2;        % Replace with actual anonymous function
fun2 = @(x,y) fun(x);   % Wrapper on fun to discard unused 2nd parameter
B= bsxfun(fun2,A,1);

答案 1 :(得分:3)

还有另一种采用accumarray的解决方案。虽然不像bsxfun那样花哨,但它不需要声明辅助函数:

subs = ndgrid(1:size(A, 1));
B = accumarray(subs(:), A(:), [], @fun); %// @fun is the function handle

答案 2 :(得分:2)

如果我明白你想做什么,我认为你可以这样做:

A = rand(3, 5);
fun = @(x) x*2;
B = cell2mat(arrayfun(@(i) fun(A(i, :)), 1:size(A, 1), 'UniformOutput', false)');

% example results:
A =

    0.5669    0.4315    0.4515    0.7664    0.5923
    0.8337    0.7317    0.4898    0.2535    0.7506
    0.3321    0.5424    0.4585    0.8004    0.9564


B =

    1.1338    0.8630    0.9030    1.5328    1.1845
    1.6675    1.4635    0.9795    0.5071    1.5013
    0.6642    1.0848    0.9169    1.6008    1.9128

这会将fun应用于A中每行的每个元素。这取决于帖子here。此外,您还可以找到更多信息和解释正在发生的事情或将函数应用于数组中的行的替代方法。

答案 3 :(得分:2)

我知道这是一个老帖子,但是如果有人看到这个,Matlab在2013b版本中添加了rowfun,它可以评估表格行并返回列向量。这是一个例子:

f = @(c) sum(c.^2);

x=[1 2;
   3 4;
   5 6];

z=table2array(rowfun(f,table(x)))

z=
   5
  25
  61