如何在 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
的最小距离,其中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
我有一个由顶点和三角形组成的几何体。我有一个大小为 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
的最小距离,其中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