此问题与matlab: find the index of common values at the same entry from two arrays有关。
假设我有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
1}}和b j
,然后我会查看行i
和j
。
如果行k
和i
的{{1}}条目的值为j
和2
,那么2
(我想我会分配)在这种情况下a=2,b=0,c=1,d=0
)。
如果行0/0=0
和k
的{{1}}条目的值为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
)。
我到目前为止使用的matlab代码是0,0
和a=0,b=2,c=0,d=1
使用for
循环,然后使用i
找到上述情况,然后为{创建两个数组{1}}和j
。这是非常缓慢的,有没有办法可以提高效率?
修改:距离find
是第13页的this paper中给出的公式。
答案 0 :(得分:0)
如果那些系数是固定的,那么我认为我已经成功地对距离函数进行了矢量化。弄清楚公式很有趣。我把事情翻了一下,以尽量减少分裂,因为直到@ horchler的注释我都不知道pdist
,所以你将它包含在循环中,并将常量考虑在内:
% 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;