创建一个邻接矩阵matlab

The*_*r23 5 matlab matrix

我为格式化道歉,这似乎是一个非常简单的问题.我是matlab和这个堆栈交换的新手.我试图从matlab中的几个列向量创建一个邻接矩阵.信息是从文本文件导入的.信息看起来像这样.

 X   Y  Z   W  

aa  bb  1   aa
bb  cc  2   bb
cc  dd  3   cc
Run Code Online (Sandbox Code Playgroud)

其中列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
Run Code Online (Sandbox Code Playgroud)

我知道如果顶点是数字的话如何创建矩阵.但我无法弄清楚如何将数值赋给列中的顶点W并使所有内容仍然匹配.

如果所有列中的值都是数字,则此代码将起作用.

A = sparse([X; Y],[Y; X],[Z; Z]);
Run Code Online (Sandbox Code Playgroud)

X, YZ高于列.当我尝试这个时,我得到以下错误

'Undefined function 'sparse' for input arguments of type 'cell'
Run Code Online (Sandbox Code Playgroud)

ray*_*ica 5

你仍然可以使用,sparse但你将不得不做更多的工作.一方面,我们需要改造的标签X,并Y成为独特的整数ID.尝试使用unique组合XY输入,以便您可以获得两者之间共享的唯一整数ID.

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

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

在这里,我们要做的是使输入成为字符串,输出为单个数字.对于每一个唯一的字符串,我们遇到的组合XY,我们会分配一个唯一的ID给它.之后,我们可以使用XY作为输入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]);
Run Code Online (Sandbox Code Playgroud)

第三行和第二行代码有点特殊.您需要使用该values函数来检索给定单元格数组键的值.我们有XY作为两个单元阵列,因此输出也是值的单元数组.我们不希望这是一个单元格数组,而是作为数字向量而不是输入sparse,这就是为什么我们用cell2mat它来为我们转换它.一旦我们终于取回的ID为XY,我们把这个到sparse完成矩阵.

当我们显示完整版本时A,我们得到:

>> full(A)

ans =

     0     1     0     0
     1     0     2     0
     0     2     0     3
     0     0     3     0
Run Code Online (Sandbox Code Playgroud)

次要说明

我看到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]);
Run Code Online (Sandbox Code Playgroud)