6

我的情况是我想A通过一个函数映射一个标量数组,句柄fun将一个行向量发送到一个行向量,以获取B,这样B(i,:) = fun(A(i,:))

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

temp = mat2cell(A,ones(1,size(A,1)),size(A,2));
B = cell2mat(cellfun(fun,temp,'UniformOutput',0));

但是,转换为单元格并返回似乎有些过大(并且可能在计算上很昂贵)。我也不清楚为什么 cellfun 抱怨输出不均匀。是否会想到更有效的方法?

4

4 回答 4

4

还有另一种解决方案采用accumarray. 虽然不如bsxfun,但它不需要声明辅助函数:

subs = ndgrid(1:size(A, 1));
B = accumarray(subs(:), A(:), [], @fun); %// @fun is the function handle
于 2013-08-13T06:38:34.207 回答
3

You can do this without using cell arrays at all with bsxfun.

Using Marcin's example data and function:

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

Edit:

As Eitan noted, fun above may need to be a wrapper on your 'real' anonymous function so it would be more complete to show my solution as:

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);
于 2013-08-13T03:43:56.233 回答
3

我知道这是一个旧帖子,但如果其他人看到这个,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
于 2015-12-22T20:15:49.573 回答
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 中行的每个元素。这是基于此处的帖子。此外,您还可以找到更多信息和解释正在发生的事情或将函数应用于数组中的行的替代方法。

于 2013-08-13T03:06:53.140 回答