我有一个从未加权和无向图中提取的 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
如果行和列的元素总和为零,则表示此节点是隔离的。因此,您可以删除其相关的行和列。