matlab - 如何在 MATLAB 中有效地查找和合并向量的重复条目?

标签 matlab sorting unique

我正在编写一个 MATLAB 代码来快速解决以下问题:设 X 是一个根据 P(x) 分布的随机变量,取两个独立的 X 副本,称它们为 X1 和 X2,并找到 Y = f 的分布(X1,X2) 其中 f(,) 是已知函数。

为了解决上述问题,我从两个向量 xp 开始,使得 p(i) = P(x (i)).假设它们都包含 n 元素。我可以很容易地计算 n-by-n 矩阵 y 这样 y(i,j) = f (x(i), x(j))。此外,我可以计算 n-by-n 矩阵 p_out 这样 p_out(i,j) = p(i) * p(j)。这意味着 P(Y = y(i,j)) = p(i,j)

现在,如果 y 的所有元素都不同,我们就差不多完成了。它仍然只是将矩阵转换为向量,并可能对它们进行排序以获得良好的输出。假设我们也通过设置

y = y(:);
p_out = p_out(:);
[y, idx] = sort(y);
p_out = p_out(idx);

但是,问题是 y 的元素通常不是唯一的。因此,我必须合并 y 的相同元素,如下所示:如果 y(i) = y(j)(现在记住 y被转换为向量)然后删除 y(j) 并设置 p(i) = p(i) + p(j)。一种肮脏的做法是使用 for 循环(因为 y 现在已排序,我们只需要将每个元素与其后续元素进行比较)。但是,我想知道是否有更好的方法。

我知道 unique 会删除向量的重复元素(因此如果我们只需要 y 就足够了)。我也知道它返回两个索引向量,以某种方式指示重复元素的位置。但是,我想不出任何好的方法来使用它的输出来适本地合并 p 的元素。

最佳答案

如果我没理解错的话,这是accummarray的工作:

y = [1 3 2 4 2 5 6 5 5 1]; %// example data
p = [.1 .5 .3 .2 .4 .1 .1 .2 .1 .3]; %// example data

[y_unique ii jj] = unique(y);
p_summed = accumarray(jj.',p).';

结果:

>> y_unique

y_unique =

     1     2     3     4     5     6

p_summed =

    0.4000    0.7000    0.5000    0.2000    0.4000    0.1000

关于matlab - 如何在 MATLAB 中有效地查找和合并向量的重复条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20615767/

相关文章:

matlab - 限制 impoly 点击并将其转换为矩形 - Matlab

matlab - 在 matlab + jacket 中使用 regionprops 获取加权质心

matlab - 求解 Ax = B ==> 错误 : Matrix is close to singular or badly scaled 形式的矩阵

c++ - 不使用标识符重复类实例化

ruby-on-rails - 如何让AngularJS检查并使用Rails后端的数据?

matlab调用scala函数

algorithm - 将排序转换为 Dijkstra 单源路径?

c - 尝试 Cormen 的堆排序,但出现段错误

java - 如何使用 Java 中的 Apache POI 库对数据透视表数据进行排序

mysql 匹配一列上的重复项,仅在另一列上不同