2015-07-24 2 views
0

У меня есть симметричная матрица смежности с нулевым значением по ее диагонали. теперь я ищу метод переупорядочения, чтобы показать сообщество, которое делит матрицу на два клика с значениями +1 и -1 соответственно. было бы полезно, если бы кто-то мог мне помочь в этом отношении.Переупорядочение симметричной матрицы смежности, содержащей +1 и -1 элементов для получения кликов

, например: матрица (10,10)

0  1 -1  1  1 -1  1  1 -1 -1 
    1  0 -1  1  1 -1  1 -1 -1 -1 
-1 -1  0 -1 -1  1  1  1  1 -1 
    1  1 -1  0  1 -1  1 -1 -1 -1 
    1  1 -1  1  0 -1  1  1 -1 -1 
-1 -1  1 -1 -1  0 -1  1  1  1 
    1  1  1  1  1 -1  0  1  1  1 
    1 -1  1 -1  1  1  1  0 -1 -1 
-1 -1  1 -1 -1  1  1 -1  0  1 
-1 -1 -1 -1 -1  1  1 -1  1  0 

выход должен быть:

1  1  1  1  1 -1 -1 -1 -1 -1 
    1  1  1  1  1 -1 -1 -1 -1 -1 
    1  1  1  1  1  1 -1 -1 -1 -1 
    1  1  1  1  1 -1 -1 -1 -1 -1 
    1  1  1  1  1 -1 -1 -1 -1 -1 
-1 -1 -1 -1 -1  1  1  1  1  1 
-1 -1 -1 -1 -1  1  1  1  1  1 
-1 -1 -1 -1 -1  1  1  1  1  1 
-1 -1 -1 -1 -1  1  1  1  1  1 
-1 -1 -1 -1 -1  1  1  1  1  1 

нулевые элементы можно рассматривать как 1

+0

Что вы хотите в качестве выхода? – user1543042

+0

Мне нужно проверить сообщество в этой матрице, я хочу знать, можно ли рисовать два клика, сортируя строки и столбцы. на самом деле одна клика, включая элементы со значением 1 и другая клика со значением -1. – sahar

+0

Выложите матрицу, которая говорит 'out = ...'. А затем объясните, что это за особенности. – user1543042

ответ

0

Из примера, я не знаю, как бороться с большинством случаев, поэтому я догадался.

a = round(3*rand(10) - 1.5); 
a(logical(eye(size(a)))) = 0; 
b = cliques(a); 

Это поддерживает требование симметрии и только должен освободиться от «крыльев» -1-х, когда есть один оставшийся после всех остальных фильтров (то есть, если число -1-х нечетно, то для поддержания симметрия элемент должен идти по диагонали).

function b = cliques(a) 
    a(a == 0) = 1; 
    n = sum(a(:) == -1); 

    s = floor(sqrt(n/2)); 

    b = ones(size(a)); 
    b(end - s + 1:end, 1:s) = -1; 
    b(1:s, end - s + 1:end) = -1; 

    n = n - 2*s^2; 

    bands = floor(n/4); 
    b(s+1, end - bands + 1:end) = -1; 
    b(end - bands + 1:end, s+1) = -1; 

    b(end - s, 1:bands) = -1; 
    b(1:bands, end - s) = -1; 

    n = n - 4*bands; 

    dots = floor(n/2); 
    if dots 
     b(end - s, s + 1) = -1; 
     b(s + 1, end - s) = -1; 
    end 

    n = n - 2*dots; 

    if n 
     b(1,1) = -1; 
    end 

    contourf(b, 'LevelList', [-1,1]); 
    set(gca,'Ydir','reverse') 

    sum(a(:)) == sum(b(:)) 
end 
+0

Dona благодарю вас за вашу помощь, я проверил ее с помощью другой матрицы взаимодействия, и это действительно сработало. но я не могу понять, как вы знали, что это должно быть написано таким образом, вы кратко объясните это? – sahar

+0

Начинается с поиска числа замедленных '-1' в вашей матрице (это' n', и я буду называть его исходным значением 'n0'). Он вычисляет наибольший квадрат, который соответствует элементам «n/2» (длина стороны квадрата равна 's'). Теперь 'n = n0 - 2s^2 <2s + 1'. Затем он найдет, как далеко он может продвинуть 4 полосы равной длины (это 'b') рядом с квадратом. Итак, 'n = n0 - 2s^2 - 4b <4'. Затем он находит, может ли он поместить точку в верхний угол каждого квадрата (это «точки»). Значение 'n = n0 - 2s^2 - 4b - 2 * точек <2'. Наконец, если 'n = 1', он помещает его в верхний левый угол и' n = 0'. – user1543042

+0

Этот алгоритм работает только в особых случаях (случаи, которые я точно знаю, можно разделить на две фракции), мне было интересно, как можно получить выход, сортируя матрицу (ввод) относительно конкретной строки или столбца? – sahar

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