我正在编写一个 MATLAB 代码来快速解决以下问题:设 X 是一个根据 P(x) 分布的随机变量,取两个独立的 X 副本,称它们为 X1 和 X2,并找到 Y = f 的分布(X1,X2) 其中 f(,) 是已知函数。
为了解决上述问题,我从两个向量 x
和 p
开始,使得 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/