创建一个邻接矩阵matlab

时间:2015-05-26 17:37:01

标签: 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'

1 个答案:

答案 0 :(得分:5)

您仍然可以使用sparse但是您还需要做更多的工作。首先,我们需要将XY中的标签转换为唯一的整数ID。尝试在合并的XY输入上使用unique,以便获得两者之间共享的唯一整数ID。

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

接下来,我将使用associative array通过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]);

第三行和第二行代码有点特殊。您需要使用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]);