如何在 Matlab 的数组中为越来越多的邻居添加递增的值?

How can I add increasing values to an increasing number of neighbours in an array in Matlab?

我有一个由顶点和三角形组成的几何体。我有一个大小为 3102x3 的矩阵,其中每一行代表一个三角形,列包含直接相邻的三角形的索引。 例如:

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

所以三角形1的邻居是三角形2,6和9,等等。 现在我想确定每个三角形与我感兴趣的一个三角形相距多少 'rows',例如三角形 4。 我想要一个数组,其索引 4 的值为 0,其邻居(索引 3、5 和 17)的值为 1,然后 3,5 和 17 的相邻三角形(总共 9 个)应为 2,依此类推。

我怎样才能简单地实现它?

你可以用图表来做到这一点。让我们把每个三角形想象成一个点,然后这个三角形有 3 个邻居,如您的矩阵所详述。

我们可以根据您的输入创建邻接矩阵,然后使用 graph 根据 adj 创建图形。矩阵,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的最小距离,其中ij是原矩阵中的行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