matlab - 当条目很复杂且舍入错误导致问题时,删除向量中的重复条目

标签 matlab

我想从 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/

相关文章:

MATLAB fwrite with skip slow

python - 将 [28,28,2] matlab 数组转换为 [2, 28, 28, 1] 张量

matlab - 如何从 MATLAB 中的 LASSO 拟合获得决定系数 (R^2)?

matlab - 独立 matlab 应用程序的 "Out of memory"错误 - 内存碎片

matlab - 更快的投影范数(二次形式、度量矩阵...)式计算

class - 复制作为句柄类的类的方法?

matlab - MATLAB 中的源树组织 (#include)

performance - Matlab:数组在循环内增长 - 那又怎样?

c++ - 如何确保 Visual Studio 在安装编译器时更新注册表

Matlab GUIDE - 当我完成浏览时如何更新 "File Path"文本框,反之亦然?