我为格式化道歉,这似乎是一个非常简单的问题.我是matlab和这个堆栈交换的新手.我试图从matlab中的几个列向量创建一个邻接矩阵.信息是从文本文件导入的.信息看起来像这样.
X Y Z W
aa bb 1 aa
bb cc 2 bb
cc dd 3 cc
Run Code Online (Sandbox Code Playgroud)
其中列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
Run Code Online (Sandbox Code Playgroud)
我知道如果顶点是数字的话如何创建矩阵.但我无法弄清楚如何将数值赋给列中的顶点W并使所有内容仍然匹配.
如果所有列中的值都是数字,则此代码将起作用.
A = sparse([X; Y],[Y; X],[Z; Z]);
Run Code Online (Sandbox Code Playgroud)
凡X, Y和Z高于列.当我尝试这个时,我得到以下错误
'Undefined function 'sparse' for input arguments of type 'cell'
Run Code Online (Sandbox Code Playgroud)
你仍然可以使用,sparse但你将不得不做更多的工作.一方面,我们需要改造的标签X,并Y成为独特的整数ID.尝试使用unique组合X和Y输入,以便您可以获得两者之间共享的唯一整数ID.
具体来说, unique将为您提供输入的所有唯一条目的列表(如此X和Y组合).为什么我们结合了的原因X和Y是因为有一定的令牌X可能不存在Y,反之亦然.在组合输入上执行此ID分配将确保一致性.该'stable'标志是存在的,因为unique实际上排序默认情况下,所有的唯一条目.如果输入是字符串的单元格数组,则单元格数组按字典顺序排序.如果要保持从单元格数组的开头到结尾遇到唯一条目的顺序,请使用该'stable'标志.
接下来,我将使用的是一个关联数组,通过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]);
Run Code Online (Sandbox Code Playgroud)
第三行和第二行代码有点特殊.您需要使用该values函数来检索给定单元格数组键的值.我们有X和Y作为两个单元阵列,因此输出也是值的单元数组.我们不希望这是一个单元格数组,而是作为数字向量而不是输入sparse,这就是为什么我们用cell2mat它来为我们转换它.一旦我们终于取回的ID为X和Y,我们把这个到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)