我为格式化而道歉,这似乎是一个非常简单的问题。我是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'
答案 0 :(得分:5)
您仍然可以使用sparse
但是您还需要做更多的工作。首先,我们需要将X
和Y
中的标签转换为唯一的整数ID。尝试在合并的X
和Y
输入上使用unique
,以便获得两者之间共享的唯一整数ID。
具体来说,unique
会为您提供输入的所有唯一条目的列表(因此X
和Y
组合在一起)。我们将X
和Y
结合起来的原因是因为X
中的某些令牌可能不会出现在Y
中,反之亦然。在组合输入上执行此ID分配将确保一致性。 'stable'
标志位于此处,因为unique
实际上排序默认情况下所有唯一条目。如果输入是字符串的单元格数组,则单元格数组按字典顺序排序。如果要保持从单元格数组的开头到结尾遇到唯一条目的顺序,请使用'stable'
标志。
接下来,我将使用associative array通过containers.Map
将字符串映射到唯一的整数。将关联数组视为字典,其中输入为键,输出为与此键关联的值。在此上下文中关联数组的最佳示例是英语字典。在这种情况下,关键是要查找的单词,值是该单词的定义。键是字符串,输出是另一个字符串。
在这里,我们要做的是使输入成为字符串,输出为单个数字。对于我们在X
和Y
的组合中遇到的每个唯一字符串,我们会为其分配唯一ID。之后,我们可以使用X
和Y
作为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]);