【问题标题】:Create an adjacency matrix matlab创建邻接矩阵matlab
【发布时间】:2015-05-26 17:37:00
【问题描述】:

对于格式设置和看似非常简单的问题,我深表歉意。我是 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'

【问题讨论】:

  • 能否分享一下你到现在为止成功完成的代码。
  • 请为您的示例数据添加您的预期输出。
  • 您的定义不清楚。 X 和 Y 是顶点吗? W 也是“顶点”,按字母顺序排序?你的 X 和 Y 是按字母顺序排列的吗?数字作为字符串,还是某种标识符?如果 X 和 Y 是数字,那么 W 怎么会出现问题呢?您的声明没有使用W。它是做什么用的?也许数据的实际样本会有所帮助。
  • @Peter X、Y、Z 和 W 是列的名称。如果 X 和 Y 是数字,那么你是对的,W 没问题。 X 和 Y 未按字母顺序排序。我有 W 是因为我想为 X 和 Y 中的每个顶点分配一个数值。W 只是组织它们。
  • 好的,看起来是这样。我已经写了一个答案。顺便说一句,(aa,cc) 条目不正确(我相信)。当前的XY 输入中不存在(aa,cc) 对。 编辑:也没有(cc,cc) 对。

标签: matlab matrix


【解决方案1】:

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

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

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

在这里,我们要做的是将输入设为字符串,将输出设为单个数字。对于我们遇到的使用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]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    • 1970-01-01
    相关资源
    最近更新 更多