【发布时间】:2017-04-12 13:09:20
【问题描述】:
如果我有一个 N×1 表列,如何检测任何行是否相同?
【问题讨论】:
-
预期输出是多少?只是对/错?
-
预期的输出是一个逻辑向量,在所有有重复值的地方都是假的,并且错误消息告诉哪一行有重复值
标签: matlab compare detection string-comparison
如果我有一个 N×1 表列,如何检测任何行是否相同?
【问题讨论】:
标签: matlab compare detection string-comparison
如果您只是想确定是否存在重复行,您可以使用unique 来执行此操作。您可以检查列中唯一值的数量并将其与同一列中的元素总数(numel)进行比较
tf = unique(t.Column) == numel(t.Column)
如果要确定哪些行是重复的,可以再次使用unique,但使用第三个输出,然后使用accumarray计算每个值的出现次数,然后选择那些多次出现的值。
[vals, ~, inds] = unique(t.Column, 'stable');
repeats = vals(accumarray(inds, 1) > 1);
% And to print them out:
fprintf('Duplicate value: %s\n', repeats{:})
如果你想要一个 true/false 的逻辑向量来表示存在重复项的位置,你可以执行与上述类似的操作
[vals, ~, inds] = unique(t.Column, 'stable');
result = ismember(inds, find(accumarray(inds, 1) > 1));
或者
[vals, ~, inds] = unique(t.Column, 'stable');
result = sum(bsxfun(@eq, inds, inds.'), 2) > 1;
更新
您可以结合以上两种方法来完成您想要的。
[vals, ~, inds] = unique(t.Column, 'stable');
repeats = vals(accumarray(inds, 1) > 1);
hasDupes = numel(repeats) > 0;
if hasDupes
for k = 1:numel(repeats)
fprintf('Duplicate value: %s\n', repeats{k});
fprintf(' Found at: ');
fprintf('%d ', find(strcmp(repeats{k}, t.Column)));
fprintf('\n');
end
end
【讨论】: