2013-10-13 3 views
2

Я хотел знать, как создать матрицу смежности из эвклидовой матрицы расстояния, которую я создал ранее. , например:Матрица смещения из евклидовой матрицы расстояния, заданная в matlab

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 показывает conectivity узел 1-6, основываясь на их евклидово расстояние между друг другом. Диагональ должна быть 0, так как расстояние от одного и того же узла равно нулю.

Есть ли способ получить матрицу смежности с двумя ближайшими соседями от Edm выше?

+0

У вас есть специальный корпус для узла 6 - узел 1 и 4 имеют одинаковое расстояние, и оба могут быть вторыми ближайшими соседями. Как следует рассматривать этот случай? – bdecaf

ответ

0

Я не получаю ответ Мохсен к работе, так вот мой (более громоздкий) предложение:

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, (как и в случае не подключенных), вы должны также учитывать это.

0

Установите диагонали Inf и использовать bsxfun для сравнения элементов в каждом столбце с минимальным значением в этом столбце:

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

Вы уверены, что это работает? Не получается, когда я его тестирую. (Я не получаю симметричную матрицу смежности) –

+0

@RobertP. Я получаю симметричный. Какой элемент отличается от 'A' и' A''? –

+0

Мне кажется, что он просто находит наименьшее значение (кроме нуля) в каждом столбце. Я получаю 'sum (A) = [1 1 1 ..]', как насчет вас? –

Смежные вопросы