使用matlab

时间:2018-05-24 08:53:57

标签: matlab matrix adjacency-matrix

我正在尝试从给定的二进制矩阵B创建一个邻域图。邻域图(A)被定义为邻接矩阵,以便

(A(i,j) = A(j,i) = 1)

如果原始矩阵B(i) = B(j) = 1i以及j与每个(左,右,上,下或对角线)相邻。在这里,我使用线性下标来访问原始矩阵B。例如,考虑以下矩阵

B = [ 0 1 0; 
      0 1 1; 
      0 0 0 ];

我的A将是一张9 * 9图表,如下所示

A = [ 0 0 0 0 0 0 0 0 0; 
      0 0 0 0 0 0 0 0 0; 
      0 0 0 0 0 0 0 0 0; 
      0 0 0 0 1 0 0 1 0; 
      0 0 0 1 0 0 0 1 0; 
      0 0 0 0 0 0 0 0 0; 
      0 0 0 0 0 0 0 0 0; 
      0 0 0 1 1 0 0 0 0; 
      0 0 0 0 0 0 0 0 0 ];

由于在原始B矩阵中,B(4)B(5)B(8)与相应的条目1相邻,因此邻接矩阵A1A(4,5)A(5,4)A(4,8)A(8,4)A(5,8) A(8,5)。{/ p>

如何以有效的方式给出矩阵A来创建这样的邻接矩阵B

2 个答案:

答案 0 :(得分:2)

这是一个使用图像处理工具箱*的解决方案,它创建邻接矩阵的稀疏矩阵表示:

B = [ 0 1 0; 
      0 1 1; 
      0 0 0 ]

n = numel(B);
C = zeros(size(B));
f = find(B);
C(f) = f;

D = padarray(C,[1 1]);
%If you don't have image processing toolbox
%D = zeros(size(C)+2);
%D(2:end-1,2:end-1)=C;
E = bsxfun(@times, im2col(D,[3 3]) , reshape(B, 1,[]));
[~ ,y] = find(E);
result = sparse(nonzeros(E),y,1,n,n);
result(1:n+1:end) = 0;

* im2col可以更有效地实施here

答案 1 :(得分:2)

这不需要任何工具箱,适用于方形或矩形矩阵。它使用具有复数的数组运算。

考虑大小为B×M的二进制矩阵N

  1. 创建M×N矩阵t,其中包含每个非零条目B的复杂坐标。也就是说,如果t(r,c)非零,则条目r+1j*c包含B(r,c),否则会NaN
  2. 计算M*N×M*N矩阵d,其中包含B每对条目的绝对差值。 B非零且相邻的条目对将在矩阵1中生成sqrt(2)d
  3. 如果A中的相应条目等于1d,则构建结果矩阵1,使其包含sqrt(2)。如果d中的相应条目介于01.5之间,则数字错误也相同且更加健壮。
  4. 代码:

    B = [0 1 0; 0 1 1; 0 0 0]; % input
    t = bsxfun(@times, B, (1:size(B,1)).') + bsxfun(@times, B, 1j*(1:size(B,2)));
    t(t==0) = NaN; % step 1
    d = abs(bsxfun(@minus, t(:), t(:).')); % step 2
    A = d>0 & d<1.5; % step 3
    

    B获取A

    B2 = zeros(sqrt(size(A,1)));
    B2(any(A,1)) = 1;