欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

矩阵中提取无重复行的操作

程序员文章站 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行排列是按照其本身数据大小升序排列