矩阵中提取无重复行的操作
程序员文章站
2022-07-12 13:50:26
...
矩阵中提取无重复行的操作
unique提取的唯一行索引中,会包含一次重复行的索引。不是想要的结果(期望得到的是,纯唯一行的索引,不包含重复行索引)
方法一:(自写循环,耗时长)
采用两个for循环,用当前行一次减去后面的每一行,通过判断减去后的是否为0来确定是否重复,然后去掉重复行。代码示例如下
clear all; clc
a=[1 1 2;1 2 3; 3 3 3; 3 3 3; 3 3 3; 1 1 2; 0 0 0; 4 4 4];
b=[];
nms=[];
nme=[];
for i=1:size(a,1)
for j=i+1:size(a,1)
cha=a(i,:)-a(j,:); %一次相减
b=[b;cha];
if cha==0 %判断差值是否为0
nms=[nms;i]; %记录差值为0的两行
nme=[nme;j];
end
end
end
repeatnm=unique([nms;nme]); %去掉重复多次的行
uniquenm=setdiff([1:size(a,1)],repeatnm); %减去差值为0的所有行,得到的结果为唯一行索引
uniqueval=a(uniquenm,:); %输出唯一行对应值
%% 该方法遍历所用行,并求差,判断。用时会增加。例如,判断一个100行的矩阵,会循环100*(100+1)/2=5050次,极大的减缓了计算时间
方法二:(多次调用setdiff函数,耗时极短)推荐
clear all; clc
a=[1 1 2;1 2 3; 3 3 3; 3 3 3; 3 3 3; 1 1 2; 0 0 0; 4 4 4];
[~, IA] = unique(a, 'rows');
uniqueval= setdiff(a(IA, :), a(setdiff(1:size(a, 1), IA), :),'rows');
此外,两者还有一个区别如下:
方法一中,输出的uniqueval行排列顺序按照原来矩阵a的行排列顺序一次往下排列。
而方法二中,输出的uniqueval行排列是按照其本身数据大小升序排列
推荐阅读