2016-04-04 4 views
0

Мне нужно назначить весы ребер графа, из следующих работ:Создания матрицы смежности веса

«Быстрые линейные итераций для распределенного усреднения» Л. Его и С. Бойд «Выпуклая Оптимизация графика Лапласианские собственные значения "С. Бойда

У меня есть матрица смежности для моего графика (матрица 50 на 50) с 512 ненулевыми значениями.

У меня также есть вектор 256 на 1 с оптимальными весами.

Для программного обеспечения, которое я использую, мне нужна матрица 50 на 50 с весом края (i, j) в соответствующем положении матрицы смежности (и с противоположным знаком для края (j, i)).

Моя попытка внизу, но я не могу заставить ее работать.

function weights = construct_weight_mtx(weight_list, Adj) 

weights = zeros(size(Adj)); 
positions = find(Adj); 

for i=1:length(positions)/2 
    if Adj(i) == 1 
     weights(i) = weight_list(i); 
    end 
end 

weights = weights - weights'; 

find(Adj) == find(weights); 

end 
+0

что не работает? – shamalaia

+0

У вас есть пара проблем, и я могу понять большинство из них, но почему вы вычитаете «веса - веса»? Действительно ли вы хотите, чтобы вес в одном направлении был отрицательным по отношению к весу в противоположном направлении? – beaker

+0

@beaker yes - Я хочу, чтобы весы были отрицательными в противоположном направлении. –

ответ

1

Вы находите ненулевые позиции в исходной матрице смежности, но вы находите все из них. Чтобы обойти это, вы берете только первую половину этих позиций.

for i=1:length(positions)/2 ... 

К сожалению, это относится к индексам из полных столбцов, а не только по положению ниже диагонали. Так что, если ваша матрица была все 1, вы бы принимать:

1 1 1 0 0 ... 
1 1 1 0 0 ... 
1 1 1 0 0 ... 
... 

вместо:

1 0 0 0 0 ... 
1 1 0 0 0 ... 
1 1 1 0 0 ... 
... 

принять правильные значения, мы просто взять нижнюю треугольную часть Adj, а затем найти ненулевые позиции, что:

positions = find(tril(Adj)); 

Теперь у нас есть только 256 позиций ниже диагонали, и мы можем перебираем все позиции. Далее, нам необходимо зафиксировать задание в цикле:

for i=1:length(positions) 
    if Adj(i) == 1 %// we already know Adj(i) == 1 for all indices in positions 
     weights(i) = weight_list(i); %// we need to update weights(positions(i)) 
    end 
end 

Так это становится:

for i=1:length(positions) 
    weights(positions(i)) = weight_list(i); 
end 

Но если все, что мы делаем, назначая 256 значений до 256 позиций, мы можем сделать это без for цикл:

weights(position) = weight_list; 

Обратите внимание, что элементы weight_list должны быть в надлежащем порядке с ненулевыми элементами нижней треугольной части упорядоченных по столбцам.


Завершенный код:

function weights = construct_weight_mtx(weight_list, Adj) 

weights = zeros(size(Adj)); 
positions = find(tril(Adj)); 

weights(positions) = weight_list; 

weights = weights - weights.'; %// ' is complex conjugate; not a big deal here, but something to know 

find(Adj) == find(weights); %// Not sure what this is meant to do; maybe an assert? 

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