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, :);
代码的工作原理如下:
M(:,[1 3])+1j*M(:,[2 4])
创建一个具有一半列的复数矩阵,其中原始矩阵的每对坐标变为复数。
sort(..., 2)
对每一行进行排序。原来是彼此打乱版本的行现在变得相同。
[~, ind] = unique(..., 'rows', 'stable')
给出每个唯一(复杂、排序)行第一次出现的索引。
M(ind, :)
从 M
中选择所需的行。
我有一个矩阵,其中每个元素都是二维坐标的一个单位。因此,任何给定行中的每个元素都是配对的,其中第一列中的元素与第二列中的元素配对,第三列中的元素与第四列中的元素配对。矩阵中存在 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, :);
代码的工作原理如下:
M(:,[1 3])+1j*M(:,[2 4])
创建一个具有一半列的复数矩阵,其中原始矩阵的每对坐标变为复数。sort(..., 2)
对每一行进行排序。原来是彼此打乱版本的行现在变得相同。[~, ind] = unique(..., 'rows', 'stable')
给出每个唯一(复杂、排序)行第一次出现的索引。M(ind, :)
从M
中选择所需的行。