在matlab中的条件下删除矩阵中的行
delete rows in matrix under conditions in matlab
我的程序创建了一个矩阵,其中几行中的单元格的值在相应列中是相同的。我想删除其中一些行以过滤矩阵。澄清一下,我的矩阵具有以下形式,
A=[ 1 2 3 4
1 2 3 5
1 2 3 6
1 2 3 7
5 6 7 8
5 6 7 9
5 6 7 10]
我想删除第一列、第二列和第三列中它们的值相同的行,并在矩阵中保留第四行中具有最大值的行。结果应为以下矩阵:
A=[ 1 2 3 7
5 6 7 10]
我知道当我们使用如下条件删除矩阵中的行时:M(M(:,4)<=1.5,:)=[];
,它会删除矩阵中第四列中值小于 [=13 的所有行=].但我不知道如何做我描述的事情
使用带有 rows
标志的 unique
并索引到前三列。确保选择 last
,以便选择遇到的 last 唯一值。默认方式是给你遇到的第一个唯一值。
从这个唯一调用中你需要的是第二个元素,它为你提供了最后一次唯一遇到的行,然后你将使用它来子集到你的原始矩阵中:
>> [~,ind,~] = unique(A(:,1:3), 'rows', 'last');
>> B = A(ind,:)
B =
1 2 3 7
5 6 7 10
下面的代码执行以下步骤:
- 按最后一列降序排列
A
- 找出前 3 列中唯一的元组
- 基于 2,select 最后一列中具有最高值的行
>> [Y,I]=sort(A(:,4), 'descend');
>> B=A(I,:);
>> [~, ind] = unique(B(:,1:3), 'rows', 'stable');
>> result = B(ind,:)
result =
5 6 7 10
1 2 3 7
另一种方法是使用 accumarray
,这将使您可以轻松地选择任意函数,而不仅仅是每组中的最大值:
[a,~,subs] = unique(A(:,1:3),'rows');
B = [a, accumarray(subs,A(:,4),[],@max)]
我的程序创建了一个矩阵,其中几行中的单元格的值在相应列中是相同的。我想删除其中一些行以过滤矩阵。澄清一下,我的矩阵具有以下形式,
A=[ 1 2 3 4
1 2 3 5
1 2 3 6
1 2 3 7
5 6 7 8
5 6 7 9
5 6 7 10]
我想删除第一列、第二列和第三列中它们的值相同的行,并在矩阵中保留第四行中具有最大值的行。结果应为以下矩阵:
A=[ 1 2 3 7
5 6 7 10]
我知道当我们使用如下条件删除矩阵中的行时:M(M(:,4)<=1.5,:)=[];
,它会删除矩阵中第四列中值小于 [=13 的所有行=].但我不知道如何做我描述的事情
使用带有 rows
标志的 unique
并索引到前三列。确保选择 last
,以便选择遇到的 last 唯一值。默认方式是给你遇到的第一个唯一值。
从这个唯一调用中你需要的是第二个元素,它为你提供了最后一次唯一遇到的行,然后你将使用它来子集到你的原始矩阵中:
>> [~,ind,~] = unique(A(:,1:3), 'rows', 'last');
>> B = A(ind,:)
B =
1 2 3 7
5 6 7 10
下面的代码执行以下步骤:
- 按最后一列降序排列
A
- 找出前 3 列中唯一的元组
- 基于 2,select 最后一列中具有最高值的行
>> [Y,I]=sort(A(:,4), 'descend');
>> B=A(I,:);
>> [~, ind] = unique(B(:,1:3), 'rows', 'stable');
>> result = B(ind,:)
result =
5 6 7 10
1 2 3 7
另一种方法是使用 accumarray
,这将使您可以轻松地选择任意函数,而不仅仅是每组中的最大值:
[a,~,subs] = unique(A(:,1:3),'rows');
B = [a, accumarray(subs,A(:,4),[],@max)]