我想在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循环或特定功能)。
答案 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;