Допустим, вы разделили свои блоки, и один из блоков сохраняется в виде двойного массива n-на-4 block
.
. Вам нужно отсортировать вершины в каждой строке, сохраняя при этом 2-й фиксированный. Этого можно достичь, используя sort
вдоль измерения строки следующим образом
sort([block(:,1),block(:,3)],2);
Второй вход 2
определяет сортировку всех строк вдоль столбца.
Далее необходимо добавить обратно 2-х вершин и выбрать уникальные комбинации вершин.
unique([block(:,2),sort([block(:,1),block(:,3)],2)],'row');
'row'
означает выбрать уникальные строки в целом, а не уникальные отдельные элементы. Вы можете добавить 'stable'
, чтобы сохранить существующий порядок. Но вы не указали такую необходимость в вопросе. Поэтому я оставлю это необязательным.
Чтобы получить исходный порядок вершин, мы используем индексы уникальных строк следующим образом. Здесь необходимо убедиться, что повторяющиеся углы, идентифицированные действительной последовательностью вершин, имеют одинаковое значение угла. (В противном случае вам нужно добавить block(:,4)
к приведенной выше формуле.)
[~, ind] = unique([block(:,2),sort([block(:,1),block(:,3)],2)],'row');
И ваш окончательный ответ: (только две строки ниже)
[~, ind] = unique([block(:,2),sort([block(:,1),block(:,3)],2)],'row');
block(ind,:),
ans =
1.0000 2.0000 3.0000 120.1200
11.0000 2.0000 3.0000 87.1200
4.0000 5.0000 8.0000 70.2500
2.0000 6.0000 10.0000 90.3900
6.0000 11.0000 12.0000 111.2000
Если бы кто-то мог написать ответ на основе oop на основе ручного кэширования, мне было бы любопытно увидеть, как это происходит выше, и циклическое с ручным кэшированием, которое быстрее.