如何通过浏览每个列名来收集最终得分?

时间:2015-03-06 20:35:21

标签: matlab indexing cell-array

我有一个包含点和名称的单元格数组

Points     NameList1        NameList2
[20]        'Mat'            'Ken'
[15]        'Ken'            'John'
[10]        'Mario'          'Mat'
[5]         'John'           'Harry'
[0]         'Kelly'          'Mario'

我想收集每个人收集的积分。我打算使用unique函数来获取名称并转到每一列,以查看每个人收集和存储的点数(例如:' Mat' [20,10]。问题我不知道如何浏览每一栏并收集号码。

谢谢。

1 个答案:

答案 0 :(得分:1)

这是accumarray的另一个经典案例。 accumarray通过使用一堆键和一堆值来工作。对于那些相同的键,相应的值将映射到同一个bin,accumarray的默认行为是将那些映射到同一个bin的值相加。在您的情况下,键是名称,值是点。

我要做的是将单元格数组中所有列上的所有名称连接成单个列向量,然后创建与我们的名称一样多的列重复的点向量。之后,我们可以使用unique来确定所有唯一名称的列表(第一个输出),并获取我们在大型名称列表中看到的每个名称的唯一ID(第三个输出)。从那里,我们可以积累我们的观点:

scores = {[20]        'Mat'            'Ken'
[15]        'Ken'            'John'
[10]        'Mario'          'Mat'
[5]         'John'           'Harry'
[0]         'Kelly'          'Mario'};

points = cell2mat(scores(:,1)); %// Get points and duplicate
points = repmat(points, size(scores,2)-1, 1);

%// Create list of all names
names = scores(:,2:end);

%// Find unique names and unique ID numbers
[unique_names, ~, id] = unique(names(:));

%// Calculate score
out = accumarray(id, points);

out将包含所有玩家的得分,unique_names将包含您与所得分相关的所有人的姓名。

因此,显示两个变量,我们得到:

>> unique_names

unique_names = 

    'Harry'
    'John'
    'Kelly'
    'Ken'
    'Mario'
    'Mat'

>> out

out =

     5
    20
     0
    35
    10
    30

因此,哈利得到5分,约翰得到20分,依此类推。