如何通过遍历每个列名来收集最终分数?

How to collect the final score by going through each column names?

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

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

我想收集大家收集的积分。我正计划使用 unique 函数来获取名称并转到每一列以查看每个人收集并存储了多少点(例如:'Mat' [20,10]。问题是我有不知道如何遍历每一列并收集数字。

谢谢。

这是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

因此,Harry 得到 5 分,John 得到 20 分,依此类推。