Вы можете сделать это с графиком.Давайте представим каждый треугольник как точку, тогда у нас есть 3 соседа для этого треугольника, детализированные вашей матрицей.
Мы можем создать матрицу смежности из вашего ввода, а затем использовать graph
, чтобы создать график изотрегулированныйматрица и distances
для вычисления кратчайшего пути между каждой парой узлов.
Я сохранил общий код, поэтому, если вы перешли к квадратам / пятиугольникам / чем угодно, добавив больше столбцов, то это все равно должно работать.
Вот полный код:
T = [2 6 9
1 3 13
2 4 15
3 5 17
4 6 21];
% Create graph values.
% Column 1 is triangle number (row number), column 2 is a neighbouring triangle
% So there are 3 rows per triangle, one for each neighbour
B = [ repmat( (1:size(T,1)).', size(T,2), 1 ), T(:) ];
% Make the relationship symmetric (i.e. if Tri3 is neighbour of Tri15, then
% Tri15 is neighbour of Tri3. This is necessary because T is incomplete.
% Use unique so we don't get duplicates if already specified
B = unique( [ B; fliplr(B) ], 'rows' );
% Create adjacency matrix from B
A = full( sparse( B(:,1), B(:,2), ones(size(B,1),1) ) );
% Create graph
G = graph( A );
% Get distances
D = G.distances;
Теперь D(i,j)
- это минимальное расстояние от треугольника i
до треугольника j
, где i
и j
- строкив исходной матрице T
.
Итак, если вас интересует треугольник 2, вы можете сделать
>> distances = D(2,:);
distances =
[2, 0, 2, 4, 4, 3, Inf, Inf, 3, Inf, Inf, Inf, 1, Inf, 3, Inf, 5, Inf, Inf, Inf, 5]
Расстояния Inf
, чтобы показать, что треугольники никогда не соединяются друг с другом,Если вы хотите сделать это в более удобной для чтения форме, вы можете сделать
distances = D(:,2); % want the column version, same values as D(2,:);
idx = ~isinf( distances );
result = [ find( idx ), distances( idx ) ];
Вывод расстояния до треугольника 2 (первый столбец - номер треугольника, второй - расстояние):
>> result
result =
1 1
2 0
3 1
4 2
5 3
6 2
9 2
13 1
15 2
17 3
21 4