[英]Create an adjacency matrix matlab
我为格式感到抱歉,这似乎是一个非常简单的问题。 我是Matlab和堆栈交换的新手。 我试图从Matlab中的几个列向量创建一个邻接矩阵。 该信息是从文本文件导入的。 该信息如下所示。
X Y Z W
aa bb 1 aa
bb cc 2 bb
cc dd 3 cc
其中X
和Y
列是顶点列的名称。 Z
是重量。 X
和Y
列具有重复的约30000
个条目。 W
列是我图中的所有顶点,按字母顺序排列,没有重复。 对于样本数据,输出应如下所示。
aa bb cc dd
aa 0 1 0 0
bb 1 0 2 0
cc 0 2 0 3
dd 0 0 3 0
如果顶点是数字的,我知道如何创建矩阵。 但是我不知道如何为W
列中的顶点分配数值,并使所有内容仍然匹配。
如果所有列中的值为数字,则此代码将起作用。
A = sparse([X; Y],[Y; X],[Z; Z]);
其中X, Y
和Z
是上面的列。 当我尝试这样做时,出现以下错误
'Undefined function 'sparse' for input arguments of type 'cell'
您仍然可以使用sparse
但是您将不得不做更多的工作。 一方面,我们需要将X
和Y
的标签转换为唯一的整数ID。 尝试对组合的X
和Y
输入使用unique
,这样您就可以在两个输入之间共享唯一的整数ID。
具体来说, unique
将为您提供输入的所有唯一条目的列表(因此X
和Y
组合在一起)。 为什么我们结合两种原因X
和Y
是因为有某些记号X
,可能不会出现在Y
,反之亦然。 在组合的输入上分配此ID将确保一致性。 出现'stable'
标志是因为默认情况下, unique
实际上对所有唯一性条目进行排序 。 如果输入是字符串的单元格数组,则该单元格数组按字典顺序排序。 如果要保持从单元数组的开头到结尾遇到唯一条目的顺序,请使用'stable'
标志。
接下来,我将使用一个通过containers.Map
的关联数组 ,该映射将字符串映射到唯一的整数。 将关联数组视为字典,其中输入是键 ,而输出是与此键关联的值 。 在这种情况下,关联数组的最佳示例是英语词典。 在这种情况下,关键是您要查找的单词,值是该单词的定义。 键是一个字符串,输出是另一个字符串。
在这里,我们要做的是使输入为字符串,而输出为单个数字。 对于X
和Y
组合所遇到的每个唯一字符串,我们将为其分配一个唯一ID。 之后,我们可以将X
和Y
用作containers.Map
输入。 containers.Map
以获取我们的ID,然后将其用作sparse
输入。
事不宜迟,这里是代码:
%// Your example
X = {'aa', 'bb', 'cc'};
Y = {'bb', 'cc', 'dd'};
Z = [1 2 3];
%// Call unique and get the unique entries
chars = unique([X Y], 'stable');
%// Create containers.Map
map = containers.Map(chars, 1:numel(chars));
%// Find the IDs for each of X and Y
idX = cell2mat(values(map, X)).';
idY = cell2mat(values(map, Y)).';
%// Create sparse matrix
A = sparse([idX; idY], [idY; idX], [Z; Z]);
代码的第三行和倒数第二行有些特殊。 您需要使用values
函数来获取给定键单元格数组的值。 X
和Y
都是单元格数组,因此输出也是值的单元格数组。 我们不希望它是一个单元格数组,而希望是一个数值向量,而不是作为sparse
输入,因此这就是为什么我们使用cell2mat
将其转换回我们的原因。 一旦我们最终获取了X
和Y
的ID,就将其放入sparse
以完成矩阵。
当显示A
的完整版本时,我们得到:
>> full(A)
ans =
0 1 0 0
1 0 2 0
0 2 0 3
0 0 3 0
我看到W
是顶点名称按字母顺序排序的单元格数组。 如果是这种情况,那么您就不需要进行任何unique
调用,只需将W
用作containers.Map
的输入即可。 因此,请执行以下操作:
%// Create containers.Map
map = containers.Map(W, 1:numel(W));
%// Find the IDs for each of X and Y
idX = cell2mat(values(map, X)).';
idY = cell2mat(values(map, Y)).';
%// Create sparse matrix
A = sparse([idX; idY], [idY; idX], [Z; Z]);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.