Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MATLAB中高效地查找和合并向量的重复项?_Matlab_Sorting_Unique - Fatal编程技术网

如何在MATLAB中高效地查找和合并向量的重复项?

如何在MATLAB中高效地查找和合并向量的重复项?,matlab,sorting,unique,Matlab,Sorting,Unique,我正在编写一个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))。此外,我可以通过矩阵p_out计算n,从而p_out(I,j)=p(I)*p(j)。这意味着P(Y=Y(i,j))=P(i,j) 现在

我正在编写一个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)
)。此外,我可以通过矩阵
p_out
计算
n
,从而
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
的元素。

如果我理解正确,这是一项针对以下人员的工作:

结果:

>> y_unique

y_unique =

     1     2     3     4     5     6

p_summed =

    0.4000    0.7000    0.5000    0.2000    0.4000    0.1000

也许这能帮上忙:@LuisMendo谢谢。我想那是另一个问题。非常感谢。我一直在寻找这样一个函数!这种独特的用法可能是我最喜欢的MATLAB习惯用法+1@chappjc如果可以组合成一行就好了,例如,如果
unique
的期望输出是第一行,而不是第三行,那么我认为两行就可以了!
>> y_unique

y_unique =

     1     2     3     4     5     6

p_summed =

    0.4000    0.7000    0.5000    0.2000    0.4000    0.1000