我在MATLAB中加载了带有常用标签的文件列表。
label filename A B
1 xxx 6
1 xxx 2
1 xxx 3
2 yyy 1
2 yyy 4
3 zzz 6
3 zzz 7
我有以下方式的另一批文件:
filename A B
yyy 1
yyy 4
aaa 2
aaa 4
aaa 6
aaa 10
zzz 6
zzz 7
我需要匹配第1组和第2组中的文件名,并为设置2(数字)分配相同的标签。匹配标签的目的是set_1中的标签在每个文件名的A列中具有最大值。现在在类似的战争中我需要找到set_2中每个文件名的最大值是否与set_2匹配。 有什么建议?
答案 0 :(得分:0)
这与" VLookUp"相同。在excel中。您可以使用ismember
:
[finder, indx] = ismember(Set2(:, 1), Set1(:, 2));
%Label will be in the 3rd column of Set2 (pre-allocation is needed):
Set2(finder, 3) = Set1(indx(finder), 1);
答案 1 :(得分:0)
如果您想要比较两个数据集之间与给定文件关联的最大值,则可以放弃在这种情况下担心标签。我将在此处使用您问题中的两个示例数据集(假设这些数据为tables的your last question}:
T1 = table([1; 1; 1; 2; 2; 3; 3], ...
{'xxx'; 'xxx'; 'xxx'; 'yyy'; 'yyy'; 'zzz'; 'zzz'}, ...
[6; 2; 3; 1; 4; 6; 7], ...
'VariableNames', {'Label', 'Filename', 'A'});
T2 = table({'yyy'; 'yyy'; 'aaa'; 'aaa'; 'aaa'; 'aaa'; 'zzz'; 'zzz'}, ...
[1; 4; 2; 4; 6; 10; 6; 7], ...
'VariableNames', {'Filename', 'A'});
首先,您可以使用intersect
获取两个表共有的文件列表。然后使用ismember
查找每个集合中常用文件的索引,用于累积值并使用accumarray
查找最大值:
commonFiles = intersect(T1.Filename, T2.Filename);
[index, accumIndex] = ismember(T1.Filename, commonFiles);
max1 = accumarray(accumIndex(index), T1.A(index), [], @max); % Max values for set 1
[index, accumIndex] = ismember(T2.Filename, commonFiles);
max2 = accumarray(accumIndex(index), T2.A(index), [], @max); % Max values for set 2
现在我们可以使用表格来显示数据:
T3 = table(commonFiles, max1, max2);
T3 =
commonFiles max1 max2
___________ ____ ____
'yyy' 4 4
'zzz' 7 7
在此示例中,两个集合中的每个文件的最大值相同。如果你只想专注于不同的那些,你可以这样做:
index = (max1 ~= max2); % Index of differing maxima
T3 = table(commonFiles(index), max1(index), max2(index));