如何在Matlab数组中增加数量的邻居中增加值?

时间:2018-12-14 13:16:35

标签: arrays matlab matrix indices

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

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

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

我该如何轻松实现呢?

1 个答案:

答案 0 :(得分:3)

您可以使用图形执行此操作。让我们想象每个三角形都是一个点,然后,这个三角形有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的最小距离,其中ij是原始矩阵{{1}中的行}。

因此,如果您对三角形2感兴趣,可以这样做

T

>> 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

输出到三角形2的距离(第一列是三角形编号,第二列是距离):

distances = D(:,2); % want the column version, same values as D(2,:);
idx = ~isinf( distances );
result = [ find( idx ), distances( idx ) ];