如何优化此邻接矩阵的创建?

时间:2018-10-09 16:07:13

标签: matlab graph adjacency-matrix

我想在MATLAB中创建一个邻接矩阵,以模拟具有国际象棋布局的通用城市中的道路网络,特别是每个节点只能与其主要邻居连接(每个节点最多8个链接)。我写了这段代码,产生了期望的输出:

rng('shuffle');

NRoads = 25;
CitySize = sqrt(NRoads);

PCross = 0.8;
Adj = zeros(NRoads);

for i = 1:NRoads
    for j = i+1:NRoads

        x = rand;
        if ismember(j, [i+1, i+CitySize, i+CitySize+1]) && x < PCross

            Adj(i, j) = 1;

        end;

    end;
end;

Adj = Adj | Adj';

但是我想知道是否有一种优化的方法(例如,没有double for循环或特定功能)。

2 个答案:

答案 0 :(得分:0)

从本质上讲,您的代码是用第一个,第五个和第六个非对角线随机填充(以给定的PCross速率),然后将该矩阵添加到自身的转置中。因此,您的循环可以由对diag的三个调用来代替:

Adj = (diag(rand(1, NRoads-1), 1) + ...
       diag(rand(1, NRoads-5), 5) + ...
       diag(rand(1, NRoads-6), 6)) > (1-PCross);
Adj = Adj | Adj.';

答案 1 :(得分:0)

即使没有clever observation that gnovice did,也很容易简化代码。

内循环:

    for j = i+1:NRoads
        x = rand;
        if ismember(j, [i+1, i+CitySize, i+CitySize+1]) && x < PCross
            Adj(i, j) = 1;
        end
    end

遍历所有j,然后查看j是否为3个给定值之一。为什么不只循环这三个值?

    for j = [i+1, i+CitySize, i+CitySize+1]
        x = rand;
        if j <= NRoads && x < PCross
            Adj(i, j) = 1;
        end
    end

这当然不再需要循环:

    j = [i+1, i+CitySize, i+CitySize+1];
    x = rand(1,3);
    j = j(j <= NRoads & x < PCross); % note elementwise &, not &&
    Adj(i, j) = 1;