我正在尝试从给定的二进制矩阵B
创建一个邻域图。邻域图(A
)被定义为邻接矩阵,以便
(A(i,j) = A(j,i) = 1)
如果原始矩阵B(i) = B(j) = 1
和i
以及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
相邻,因此邻接矩阵A
已1
,A(4,5)
,A(5,4)
,A(4,8)
,A(8,4)
和A(5,8)
A(8,5)
。{/ p>
如何以有效的方式给出矩阵A
来创建这样的邻接矩阵B
?
答案 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
。
M
×N
矩阵t
,其中包含每个非零条目B
的复杂坐标。也就是说,如果t(r,c)
非零,则条目r+1j*c
包含B(r,c)
,否则会NaN
。M*N
×M*N
矩阵d
,其中包含B
每对条目的绝对差值。 B
非零且相邻的条目对将在矩阵1
中生成sqrt(2)
或d
。A
中的相应条目等于1
或d
,则构建结果矩阵1
,使其包含sqrt(2)
。如果d
中的相应条目介于0
和1.5
之间,则数字错误也相同且更加健壮。代码:
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;