Matlab:当第一个和最后两个元素被洗牌时删除行

Matlab: Remove rows when first and last 2 elements are shuffled

我有一个矩阵,其中每个元素都是二维坐标的一个单位。因此,任何给定行中的每个元素都是配对的,其中第一列中的元素与第二列中的元素配对,第三列中的元素与第四列中的元素配对。矩阵中存在 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

感谢您的宝贵时间。

非常感谢,

马特

复数可以派上用场:

[~, 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 中选择所需的行。