这个问题与matlab有关:从两个数组的同一条目中找到公共值的索引。
假设我有一个1000
由10000
一个包含价值矩阵0
,1
和2
。每行都视为一个样本。我想根据公式计算这些样品之间的成对距离d = 1-1/(2p)sum(a/c+b/d)
,其中a
,b
,c
,d
可以以作为长度的行向量处理10000
根据一些定义和p=10000
。c
并且d
是这样的概率c+d=1
。
如何找到的值的例子a
,b
,c
,d
:假设我们想找到d
样本之间i
和bj
的话,我看行i
和j
。
如果k
排个入口i
和j
具有价值2
和2
,然后a=2,b=0,c=1,d=0
(我想我会分配0/0=0
在这种情况下)。
如果k
排个入口i
和j
具有价值2
和1
反之亦然,然后a=1,b=0,c=3/4,d=1/4
。
类似的分配将赋予2,0
(a=0,b=0,c=1/2,d=1/2
),1,1
(a=1,b=1,c=1/2,d=1/2
),1,0
(a=0,b=1,c=1/4,d=3/4
),0,0
(a=0,b=2,c=0,d=1
)。
到目前为止,我拥有的Matlab代码是for
为i
和使用循环j
,然后通过使用查找上面的情况find
,然后为a/c
和创建两个数组b/d
。这非常慢,有没有办法可以提高效率?
编辑:距离d
是本文第13页中给出的公式。
如果这些系数是固定的,那么我认为我已经成功地向量化了距离函数。弄清楚公式很有趣。我稍微翻转了一些东西以最大程度地减少除数,并且由于pdist
直到@horchler的注释我才意识到,因此将其包裹在循环中,并排除了常量:
% m is the data
[n p] = size(m, 1);
distance = zeros(n);
for ii=1:n
for jj=ii+1:n
a = min(m(ii,:), m(jj,:));
b = 2 - max(m(ii,:), m(jj,:));
c = 4 ./ (m(ii,:) + m(jj,:));
c(c == Inf) = 0;
d = 1 - c;
distance(ii,jj) = sum(a.*c + b.*d);
% distance(jj,ii) = distance(ii,jj); % optional for the full matrix
end
end
distance = 1 - (1 / (2 * p)) * distance;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句