matlab中是否有从索引向量创建邻接矩阵的函数?
Is there a function making an adjacency matrix from index vector in 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.
我有一个向量集如下:
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.