Matlab: убрать строки, когда первый и последний 2 элемента перемешаны - PullRequest
1 голос
/ 11 марта 2020

У меня есть матрица, в которой каждый элемент представляет собой единицу двумерной координаты. Таким образом, каждый элемент в любой данной строке является парным, где элементы в первом столбце связаны с элементами во втором, а элементы в третьем столбце связаны с четвертым. Все возможные комбинации из 4 чисел присутствуют в матрице.

Что мне нужно сделать, так это развернуть матрицу, удалив строки, в которых первый набор координат (например, столбцы 1 и 2 в строке) поменялся местами с второй набор координат. Например, если одна строка содержит значение «3, 4, 2, 1», то мне нужно будет удалить «2, 1, 3, 4» из другого места в матрице.

Примером этого может быть будет видно ниже, где я хотел бы удалить последнюю строку, так как она противоположна первой строке;

3 3 1 1 1 2 2 3 3 4 1 2 4 4 3 1 4 1 4 4 1 1 3 3

Я довольно озадачен тем, как это сделать и мои предыдущие попытки все провалились. Хотя это может быть бесполезно для ответа, я включил мой код, показывающий, как я строю исходную матрицу ниже:

%create list of all piece coordinates
p1_row_index=(1:n);
p1_column_index=(1:n);
p2_row_index=(1:n);
p2_column_index=(1:n);

% get all possible combinations of these variables
[p1_row_index,p1_column_index,p2_row_index,p2_column_index]=BalanceFactors(1,1,1:n,1:n,1:n,1:n); 
pc_list(:,1)=p1_row_index; % piece1 coordiantes for rows
pc_list(:,2)=p1_column_index; % piece1 coordiantes for columns
pc_list(:,3)=p2_row_index; % piece2 coordiantes for rows
pc_list(:,4)=p2_column_index; % piece2 coordiantes for columns

Спасибо за ваше время.

Большое спасибо,

Мэтт

1 Ответ

0 голосов
/ 11 марта 2020

Комплексные числа пригодятся для этого:

[~, ind] = unique(sort(M(:,[1 3])+1j*M(:,[2 4]), 2), 'rows', 'stable');
result = M(ind, :);

Код работает следующим образом:

  1. M(:,[1 3])+1j*M(:,[2 4]) создает сложную матрицу с половиной столбцов, где каждая пара координат исходной матрицы становится комплексным числом.
  2. sort(..., 2) сортирует каждую строку. Строки, которые изначально были перемешанными версиями друг друга, теперь становятся идентичными.
  3. [~, ind] = unique(..., 'rows', 'stable') дает индекс первого вхождения каждой уникальной (сложной, отсортированной) строки.
  4. M(ind, :) выбирает желаемые строки из M.
...