我有一个包含点和名称的单元格数组
Points NameList1 NameList2
[20] 'Mat' 'Ken'
[15] 'Ken' 'John'
[10] 'Mario' 'Mat'
[5] 'John' 'Harry'
[0] 'Kelly' 'Mario'
我想收集每个人收集的积分。我打算使用unique
函数来获取名称并转到每一列,以查看每个人收集和存储的点数(例如:' Mat' [20,10]。问题我不知道如何浏览每一栏并收集号码。
谢谢。
答案 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分,依此类推。