【问题标题】:How can I add increasing values to an increasing number of neighbours in an array in Matlab?如何在 Matlab 中为数组中越来越多的邻居添加越来越多的值?
【发布时间】:2019-05-15 18:32:21
【问题描述】:

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

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

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

如何以简单的方式实现这一点?

【问题讨论】:

  • 1) 可能“简单”不是一个可以描述答案的词:P 2) 你能更好地描述你的例子吗?我对它有点困惑 3)你为什么需要这个?您可能遇到了 XY 问题
  • @Wolfie 确实如此。我正在使用图表做类似的事情,但我不想在没有那个 3) 的情况下到达那里,以防万一
  • 感谢您的 cmets。 @AnderBiguri,我已经计算了顶点的模式,但我只想为靠近我感兴趣的点(三角形)的三角形显示它。要在我正在使用的软件中执行此操作,我需要一个数组,其值为 1 表示紧邻的三角形,2 表示它们的邻居等。所以可能有不同的方式,但我需要这个输出才能在软件中运行它。

标签: arrays matlab matrix indices


【解决方案1】:

您可以使用图表来做到这一点。让我们将每个三角形想象成一个点,然后我们有这个三角形的 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

【讨论】: