Matlab - расстояние матрицы до таблицы - PullRequest
2 голосов
/ 07 июня 2019

Как преобразовать матрицу расстояний, сгенерированную с помощью следующего кода (DM), в таблицу с определенной структурой? Я думал о цикле, но не знаю, как его построить.

Код:

clc;
clear;

rng('default')  
X = rand(4);
DM = squareform(pdist(X))

Структура таблицы:

Object1   Object2   Distance
1         2         0.7190
1         3         1.1237
1         4         0.8285  
2         1         0.7190
2         3         1.1790
2         4         0.5657
…         …         …
4         3         1.3360

Ответы [ 2 ]

3 голосов
/ 07 июня 2019

Я бы использовал логический индекс для удаления диагонали и построения таблицы из этого:

ind = ~eye(size(DM));
[Object2, Object1] = find(ind);
Distance = DM(ind); % DM would need to be transposed first, but it is symmetric
result = table(Object1, Object2, Distance);
2 голосов
/ 07 июня 2019

Вот решение без использования цикла for:

  1. Построить индексы первого и второго столбцов, используя meshgrid.
  2. Преобразование индексов и DM в векторы столбцов.
  3. Удалить каждый 4-й элемент (расстояние до объекта).

Полный пример кода:

clc;
clear;

rng('default')
X = rand(4);
DM = squareform(pdist(X));

d = length(X);

%Span combinations of rows / columns (indexes)
%C aplies Object1, R aplies Object2
[C, R] = meshgrid(1:d, 1:d);

%Reshape DM, C, R to a column vectors;
Dist = DM(:);
Obj1 = C(:);
Obj2 = R(:);

%Remove items with object distance to itself (i.e (1,1), (2,2), (3,3), (4,4)).
Dist(1:d+1:end) = [];
Obj1(1:d+1:end) = [];
Obj2(1:d+1:end) = [];

%Concatenate columns to create a table:
T = [Obj1, Obj2, Dist];

%Table with named variables (if you really need it).
T_table = table(Obj1, Obj2, Dist);

Результат:

T_table =

12×3 table

Obj1    Obj2     Dist  
____    ____    _______

 1       2        0.719
 1       3       1.1237
 1       4      0.82577
 2       1        0.719
 2       3        1.179
 2       4      0.56567
 3       1       1.1237
 3       2        1.179
 3       4        1.336
 4       1      0.82577
 4       2      0.56567
 4       3        1.336
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...