繁体   English   中英

创建邻接矩阵Matlab

[英]Create an adjacency matrix matlab

我为格式感到抱歉,这似乎是一个非常简单的问题。 我是Matlab和堆栈交换的新手。 我试图从Matlab中的几个列向量创建一个邻接矩阵。 该信息是从文本文件导入的。 该信息如下所示。

 X   Y  Z   W  

aa  bb  1   aa
bb  cc  2   bb
cc  dd  3   cc

其中XY列是顶点列的名称。 Z是重量。 XY列具有重复的约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, YZ是上面的列。 当我尝试这样做时,出现以下错误

'Undefined function 'sparse' for input arguments of type 'cell'

您仍然可以使用sparse但是您将不得不做更多的工作。 一方面,我们需要将XY的标签转换为唯一的整数ID。 尝试对组合的XY输入使用unique ,这样您就可以在两个输入之间共享唯一的整数ID。

具体来说, unique将为您提供输入的所有唯一条目的列表(因此XY组合在一起)。 为什么我们结合两种原因XY是因为有某些记号X ,可能不会出现在Y ,反之亦然。 在组合的输入上分配此ID将确保一致性。 出现'stable'标志是因为默认情况下, unique实际上对所有唯一性条目进行排序 如果输入是字符串的单元格数组,则该单元格数组按字典顺序排序。 如果要保持从单元数组的开头到结尾遇到唯一条目的顺序,请使用'stable'标志。

接下来,我将使用一个通过containers.Map关联数组 ,该映射将字符串映射到唯一的整数。 将关联数组视为字典,其中输入是 ,而输出是与此键关联的 在这种情况下,关联数组的最佳示例是英语词典。 在这种情况下,关键是您要查找的单词,值是该单词的定义。 键是一个字符串,输出是另一个字符串。

在这里,我们要做的是使输入为字符串,而输出为单个数字。 对于XY组合所遇到的每个唯一字符串,我们将为其分配一个唯一ID。 之后,我们可以将XY用作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函数来获取给定键单元格数组的值。 XY都是单元格数组,因此输出也是值的单元格数组。 我们不希望它是一个单元格数组,而希望是一个数值向量,而不是作为sparse输入,因此这就是为什么我们使用cell2mat将其转换回我们的原因。 一旦我们最终获取了XY的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM