0

我有一个对称邻接矩阵,其对角线上的值为零。现在我正在寻找重新排序方法来显示社区,该社区将矩阵分为两个集团,分别具有 +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

4

1 回答 1

0

因为这个例子,我不确定如何处理大多数情况,所以我猜了。

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

-1这保持了对称性要求,并且仅当在所有其他过滤器之后还剩下一个时才需要从 's 的“翅膀”中打破(即,如果-1's 的数量是奇数,那么要保持对称性,一个元素必须在对角线上) .

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
于 2015-07-25T16:13:23.907 回答