如何从邻接矩阵中删除未连接的节点



我有一个从未加权和无向图中提取的 1 和 0 的邻接矩阵 (n*n(,我的目标是从这个矩阵中删除全零列及其相应的行,这些行未连接到图中的任何节点。

我想通过使用这个邻接矩阵应用一种算法,但遗憾的是 NaN 产生,因为这个矩阵中的某些列都是 0。所以,我只需要连接的组件。

fid= fopen('file.txt','rt');
format = repmat('%q',[1 2]);
filee= textscan(fid,format,'Delimiter', 't');
fclose(fid);
AA2= [filee{:, 1} , filee{:, 2}];
[nodenames, ~, id] = unique(AA2(:));
Adjacency_Matrix= accumarray(reshape(id, size(AA2)), 1, [numel(nodenames), numel(nodenames)]);
Adjoint2 = sum(Adjacency_Matrix~=0,1);

https://drive.google.com/file/d/0B6u8fZadKIp2OFd2X1NrZEdIclU/view

通过此命令 Adjoint2 = sum(Adjacency_Matrix3~=0,1(;我可以知道每列中有多少个 1。在此矩阵中,某些列没有 1,因此不需要它们。

由于矩阵是 (NN(,我想得到一个 (m m( 矩阵,其中的列只有 1。

您可以使用

any函数:

如果矩阵是对称的,您可以这样做来删除零列和行:

idx = any(Adjacency_Matrix);
result = Adjacency_Matrix(idx,idx);

否则,您可以生成列和行的索引:

idx_column = any(Adjacency_Matrix);
idx_row = any(Adjacency_Matrix,2);

您可以在此处删除列和行

result = Adjacency_Matrix(idx_row, idx_column)

如果您只想删除columns请使用以下命令:

result = Adjacency_Matrix(:, idx_column)

如果只想删除rows请使用以下命令:

result = Adjacency_Matrix(idx_row, :)

这将是一个蛮力解决方案,因为您使用的是邻接矩阵。您必须遍历矩阵的所有行并确定哪些行为空,并从这些行创建新的邻接矩阵,省略正确的列。

您可以使用以下代码:

   i = 1;
   while(i<=length(A)) 
       if(sum(A(i,:)) == 0 && sum(A(:,i)) == 0)
             % node i is isolated
             A(:,i) = []; % remove its related column
             A(i,:) = []; % remove its related row
        else
             i = i + 1;
        end
   end

如果行和列的元素总和为零,则表示此节点是隔离的。因此,您可以删除其相关的行和列。

最新更新