我有一个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'
答案 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
如果行和受尊重列的元素总和为零,则表示此节点已隔离。因此,您可以删除其相关的行和列。