使用匿名函数而不是循环来汇总单元格数组

时间:2016-11-02 11:53:15

标签: arrays matlab vectorization

我有一个叫做数据的矩阵。它包含3列,公司名称,公司价值和公司货币,有点像下面。

  Name      Value      Currency
  ABC       10         USD
  MNO       5          JPY
  PLM       3          USD
  NJK       7          EUR

我需要对每种货币的总价值求和,以便我的答案如下所示,

 Currency    Value
 EUR         7
 JPY         5
 USD         13

我知道我可以使用循环执行此操作,但是可以使用匿名函数,如果可以,如何使用?

更新 - 原始帖子缺少信息的额外信息

以下是我的解决方案,它有效。然而,我已经看到人们使用cellFun或匿名函数,并且就像这种性质的问题有一种更有效的方式(并希望以其他方式)

val     = cell2mat(data(:, 2));              % double - value
sedols  = data(:, [1 3]);                   % cell - name (1st column) and currency (2nd column)

ccy     = unique(sedols(:, 2));
fx_exp  = zeros(length(ccy(:, 1)), 1);

for n = 1 : length(ccy(:, 1))
    index           = strmatch(ccy(n, 1), sedols(:, 2));
    fx_exp(n, 1)    = sum(val(index));
end

1 个答案:

答案 0 :(得分:5)

使用cellfunarrayfun 并非比简单循环更有效。要利用矢量化,您需要使用纯双数组

假设您的数据存储在单元格数组中,uniqueaccumarray相结合即可:

data = {
    'ABC'   10  'USD'
    'MNO'   5   'JPY'
    'PLM'   3   'USD'
    'NJK'   7   'EUR' };

[a,b,subs] = unique(data(:,3))
vals = [data{:,2}];
currsum = accumarray(subs,vals)
out = [data(b,3) num2cell(currsum)]
out = 

'EUR'    [ 7]
'JPY'    [ 5]
'USD'    [13]