前言
需求:找到多组数据中,同时为多组数据中的归一化后的前百分之几的数据点的位置。需要将多组数据中的前百分之几的数据进行提取,同时获取其对应的位置与数据,并对提取出来的数据找到其同位置的并集。
一、提取符合条件的数据
示例:有随机生成的两组数据如下:
% 随机生成均匀分布的随机整数, 0 ~ 20 开区间中1*10矩阵
E1 = randi(20,1,10)
E2 = randi(20,1,10)
运行结果
先使用归一化,再直接判断是否大于条件(如数据归一化后的前30%),再提取位置和数据
E1_1 = mapminmax(E1, 0, 1); %数据归一化,注意此函数功能为将每一行数据归一化为0-1,
E2_1 = mapminmax(E2, 0, 1);%如果数据矩阵为多行一列将无法归一化
Location_E1=find(E1_1>0.7); %前30%的点的位置
Location_E2=find(E2_1>0.7);
Roi_E1=E1_1>0.7;%掩膜
Roi_E2=E2_1>0.7;%掩膜
Data_E1=E1 (Roi_E1);%高于条件的具体数据值
Data_E2=E2 (Roi_E2);
%可以使用一个矩阵专门存取数据
Filter_Results_E1=[Location_E1;Data_E1];
Filter_Results_E2=[Location_E2;Data_E2];
注意:本文中的条件为归一化的前百分之几,而不是排在前百分之几的数据,假如数据存在着突变,会影响归一化后的分布,从而可能出现只有一个数符合或者大多数符合。如果需要排列在前百分之几的数据,可以先排序,再取数据。
代码如下示例
%降序
[E1_2,L1]= sort(E1,2,"descend")%即可得到排序后的数和各数在原排列中排第几
[E2_2,L2]= sort(E2,2,"descend")
% %升序,要升序就注释上面,取下面
% [E1_2,L1]= sort(E1,2)
% [E2_2,L2]= sort(E2,2)
t=round(length(E1)*0.3);%前百分之30的点的个数
Data_E1_Sort=E1_2(1:t)%数据值
Data_E2_Sort=E2_2(1:t)
Location_E1_Sort=L1(1:t)%位置
Location_E2_Sort=L2(1:t)
Filter_Results_E1=[Location_E1_Sort;Data_E1_Sort]%存储数组
Filter_Results_E2=[Location_E2_Sort;Data_E2_Sort]
运行结果
二、找到数组中的相同元素
代码如下(示例):
Filter_Results=Location_E1(ismember(Location_E1, Location_E2))%两个位置集的交集
运行结果(示例)
总结
按照上述代码即可将符合某一条件的数据进行提取,然后取并集。
参考来源
1.如何利用 Matlab实现矩阵相同元素的查找? - 王赟 Maigo的回答 - 知乎
https://www.zhihu.com/question/23099007/answer/23599370
2.https://blog.csdn.net/gxuan/article/details/8989104
3.https://blog.csdn.net/shulianghan/article/details/115718713#2_200