gpt4 book ai didi

matlab - 创建邻接矩阵matlab

转载 作者:太空宇宙 更新时间:2023-11-03 19:43:23 24 4
gpt4 key购买 nike

我为格式和这个看起来很简单的问题道歉。我是 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但你将不得不做更多的工作。一方面,我们需要转换 X 中的标签和 Y成唯一的整数 ID。尝试使用 unique 上合XY输入,以便您可以获得两者之间共享的唯一整数 ID。

具体来说,unique将为您提供输入的所有唯一条目的列表(因此 XY 合并)。我们将两者结合的原因XY是因为 X 中有某些标记Y 中可能不存在反之亦然。在组合输入上执行此 ID 分配将确保一致性。 'stable'旗帜在那里是因为unique实际上默认排序所有唯一条目。如果输入是字符串元胞数组,则元胞数组按字典顺序排序。如果要维护从单元格数组的开头到结尾遇到的唯一条目的顺序,请使用 'stable'旗帜。

接下来,我要使用的是 associative array通过 containers.Map 将一个字符串映射到一个唯一的整数。将关联数组想象成一个字典,其中输入是一个,输出是一个与该键关联的。在这种情况下,关联数组的最佳示例是英语词典。本例中的键是你要查找的词,值是这个词的定义。 key是一个字符串,output是另一个字符串。

在这里,我们要做的是将输入设为字符串,将输出设为单个数字。对于我们使用 X 组合遇到的每个唯一字符串和 Y ,我们将为其分配一个唯一 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 的原因为我们把它转换回来。一旦我们最终检索到 X 的 ID和 Y ,我们把它放入 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]);

关于matlab - 创建邻接矩阵matlab,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30465259/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com