Как я могу добавить увеличивающиеся значения к растущему числу соседей в массиве в Matlab? - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть геометрия, которая состоит из вершин и треугольников.У меня есть матрица размером 3102x3, в которой каждая строка представляет один треугольник, а столбцы содержат индексы треугольников, которые непосредственно соседствуют.Например:

2     6     9
1     3    13
2     4    15
3     5    17
4     6    21

Итак, соседи треугольника 1 - это треугольники 2,6 и 9 и т. Д. Теперь я хочу определить, сколько «рядов» каждого треугольника находится в одном интересующем меня треугольнике.Например, треугольник 4. Я хочу, чтобы массив имел значение 0 для индекса 4, значение 1 для его соседей (индексы 3, 5 и 17), тогда соседние треугольники 3,5 и 17 (итого 9) должны быть2 и так далее.

Как я могу реализовать это простым способом?

1 Ответ

0 голосов
/ 14 декабря 2018

Вы можете сделать это с графиком.Давайте представим каждый треугольник как точку, тогда у нас есть 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...