是否有一个函数从matlab中的索引向量制作邻接矩阵?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否有一个函数从matlab中的索引向量制作邻接矩阵?相关的知识,希望对你有一定的参考价值。

我有一个矢量集如下:

S = { [14, 2, 11, 10, 3, 8, 7, 1], [15, 4, 8, 7, 1], [16, 5, 4, 8, 7, 1] };

例如,S {1}表示在(14,2),(2,11),(11,10),(10,3),(3,8),(8,7)之间存在边( 7,1)。

我想基于S建立一个邻接矩阵。我的代码如下:

N = 20;
A = zeros(N);
for i=1:length(S)
    for j=1:length(S{i})-1
        from = S{i}(j);
        to = S{i}(j+1);
        A(from, to) = 1;
        A(to, from) = 1;
    end
end

是否有像我的代码一样的功能?我认为现有的代码比我的类似C代码的代码要快得多。

答案

我不熟悉在没有先构建图形的情况下创建邻接矩阵的函数。如果您只是想要更快的实施,那么以下内容可能对您有用。对于像你发布的那个小问题,它不会更快,但对于大问题,它似乎要快4-5倍。

A = zeros(N);
for idx=1:numel(S)
    s = S{idx};
    from = s(1:end-1);
    to = s(2:end);
    A(([to from]-1)*N+[from to]) = 1;
end

这是我为测试目的而创建的大型示例问题。

N = 1000;
S = cell(1,1000);
for idx = 1:numel(S)
    r = randperm(N);
    S{idx} = r;
end

使用MATLAB2017a进行时序差异:

Your method: 0.149983 seconds.
This method: 0.036491 seconds.

以上是关于是否有一个函数从matlab中的索引向量制作邻接矩阵?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中使用向量对的向量制作邻接表?

使用向量作为矩阵的索引

matlab基本函数find

MATLAB - 将向量转换为矩阵

是否有用于查找向量中元素索引的 R 函数?

转换向量索引超出数组边界 - matlab