我的程序创建一个矩阵,在相应的列中,多行中单元格的值相同。我想删除其中一些行以过滤矩阵。为了澄清,我的矩阵有以下形式,
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,:)=[];
,它会删除矩阵中第四列中的值小于1.5
的所有行。但我不知道如何做我所描述的事情
答案 0 :(得分:2)
以下代码执行以下步骤:
A
>> [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
答案 1 :(得分:1)
另一种方法是使用accumarray
,这将允许您轻松选择任意函数,而不仅仅是每组中的最大值:
[a,~,subs] = unique(A(:,1:3),'rows');
B = [a, accumarray(subs,A(:,4),[],@max)]
答案 2 :(得分:0)
将unique
与rows
标记和索引一起使用到前三列中。请务必选择last
,以便选择遇到的最后唯一值。默认方式是为您提供遇到的第一个唯一值。
这个唯一调用所需要的是第二个元素,它为您提供了最后一个遇到的行的行,然后您将其用于子集到原始矩阵中:
>> [~,ind,~] = unique(A(:,1:3), 'rows', 'last');
>> B = A(ind,:)
B =
1 2 3 7
5 6 7 10