在Matlab中给定欧几里得距离矩阵生成邻接矩阵

3

我想知道如何从我之前创建的欧几里得距离矩阵中创建邻接矩阵。

例如:

 Edm =  [0       7.7466  7.7534  0       3.7296  2.8171;
         7.7466  0       0.0068  7.7466  4.0170  4.9295;
         7.7534  0.0068  0       7.7534  4.0239  4.9364;
         0       7.7466  7.7534  0       3.7296  2.8171;
         3.7296  4.0170  4.0239  3.7296  0       0.9125;
         2.8171  4.9295  4.9364  2.8171  0.9125  0     ]

Edm 基于它们之间的欧几里得距离显示连接节点 1-6。对角线必须为 0,因为同一节点之间的距离为零。

我能否从上面的 Edm 检索具有 2 个最近邻居的邻接矩阵?


您有一个特殊情况,即节点6 - 节点1和4具有相同的距离,两者都可能是第二近的邻居。应该如何处理这种情况? - bdecaf
2个回答

0

将对角线设置为Inf,并使用bsxfun将每列中的元素与该列中的最小值进行比较:

E = Edm + diag(Inf(1,size(Edm,1)));
A = bsxfun(@eq, E, min(E));

你确定这个能用吗?当我测试它的时候,结果出错了。(我没有得到对称的邻接矩阵) - Stewie Griffin
@RobertP。我得到了一个对称的。AA'之间有什么不同的元素? - Mohsen Nosratinia
在我看来,它只是在每列中找到最小值(零除外)。我得到 sum(A) = [1 1 1 .. ],你呢? - Stewie Griffin
这是预期的。因为在这个例子中,没有一个点有超过一个最近的邻居。 - Mohsen Nosratinia

0

我无法让Mohsen的答案正常工作,所以这是我的(更繁琐)建议:

sz = size(Edm,1);
n = 2;             % Number of desired smallest distances
E = Edm + diag(Inf(1,sz));
[~, mm] = sort(E);

mmi = mm(1:n,:)';  % n smallest distances (in your example, n = 2)

Edm_idx = sparse(mmi(:),repmat(1:sz,1,n),1,sz,sz);

Adj = full(Edm.*Edm_idx);

注意,Edm 中存在非对角线值为 0 的情况。如果这些值应该是 Inf(即未连接),您也必须考虑到这一点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接