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

时间:2017-06-19 05:05:59

标签: matlab adjacency-matrix

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

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

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,所以不想要它们。

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

3 个答案:

答案 0 :(得分:2)

您可以使用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, :)

答案 1 :(得分:1)

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

答案 2 :(得分:1)

您可以使用以下代码:

   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

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