我想从 Matlab 上的向量中删除重复项。我遇到的问题是舍入错误使内置的 Matlab 函数“唯一”无法正常工作。理想情况下,我想要一种方法来设置对“独特”功能的某种容忍度,或者一个可以删除重复项的小程序。如果两个条目的实部和虚部相差小于 0.0001,那么我很乐意将它们视为相等。我该怎么做?
任何帮助将不胜感激。谢谢
最佳答案
一个简单的近似是将数字四舍五入并使用 unique 返回的索引:
X = ... (input vector)
[b, i] = unique(round(X / (tolerance * (1 + i))));
output = X(i);
(根据您的 Matlab 版本,您可以将 b
替换为 ~
)。
它不会完全具有您想要的行为,因为两个数字可能非常接近但四舍五入的方式不同。我认为您可以通过以下方式缓解这种情况:
X = ... (input vector)
[b, ind] = unique(round(X / (tolerance * (1 + i))));
X = X(ind);
[b, ind] = unique(round(X / (tolerance * (1 + i)) + 0.5 * (1 + i)));
X = X(ind);
这将对它们进行两次舍入,因此任何恰好位于舍入边界上的数字都将被第二个 unique
捕获。
这仍然有些困惑——一些数字会受到影响,就好像公差增加了一倍一样。但这可能足以满足您的需求。
替代方案可能是 for
循环:
X = sort(X);
last = X(1);
indices = ones(numel(X), 1);
for j=2:numel(X)
if X(j) > last + tolerance * (1 + i)
last = X(j) + tolerance * (1 + i) / 2;
else
indices(j) = 0;
end
end
X = X(logical(indices));
我认为这具有您可以预期的最佳行为(因为您希望用尽可能少的唯一值表示向量 - 当有很多数字相差小于容差水平时,可能有多种方式拆分它们。该算法从最小的开始贪婪地这样做)。
关于matlab - 当条目很复杂且舍入错误导致问题时,删除向量中的重复条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10286601/