当前位置:伍佰目录 » 站长资讯 » 免费资源 » 技术文章 » 文章详细

MATLAB实现excel中vlookup函数的查找匹配功能

来源:本站原创 浏览:343次 时间:2021-05-19
1.介绍我遇到的问题

图1

图2 

问题:我要根据图1的第一列店名和图2的店名为相等条件去匹配图1的第二列数据到图2黄色区域。 

2.MATLAB实现与excdl的vlookup函数相同功能的代码
function Result_data=CellLookup(x,y,xdata)    % x为y的子集    % x为需要查找的    % y为x查找的范围数据    %xdata为当x=y时候,所匹配的数据,x和xdata数据是对应的    %声明空间    index_x=zeros(1,length(x));    index_y=zeros(1,length(x));    data=num2cell(zeros(length(y),3)*NaN);    for i=1:length(x)        for j=1:length(y)            if isequal(x(i),y(j))                index_x(i)=i;                index_y(i)=j;            end        end    end    data(:,1)=y;    for n=1:length(index_x)%子集长度        data(index_y(n),2)=x(index_x(n));       data(index_y(n),3)=xdata(index_x(n));    end    Result_data=dataend

3.运行效果

评价:完美匹配数据。注意:此代码适合cell类型数据匹配。如果是其他类型请提前转换为其他类型4.算法的改进:解决x不是y子集问题

前面介绍的算法缺点是x必须为y的子集

下面是测试的代码:

clear,clc;%x是y的子集,将x与y对应位置匹配,缺数据赋值为NaNx=[1 2 4 5,9 ];y=[1,2,3,4,5,7,9,10];%声明空间index_x=zeros(1,length(x));index_y=zeros(1,length(x));pdata=zeros(1,length(y))*NaN;for i=1:length(x)    for j=1:length(y)        if x(i)==y(j)            index_x(i)=i;            index_y(i)=j;        end    endendfor n=1:length(index_x)%子集长度    pdata(index_y(n))=x(index_x(n));endresult=[pdata;y];

代码效果 如下:

思考:如果x不是y的子集时候会怎么样

会显示:数组索引必须为正整数或逻辑值。

很明显看出index_x与index_y中含有0,索引不可能0。此处为问题所在

解决方法:剔除0数据就行了

index_x(find(index_x==0))=[];index_y(find(index_y==0))=[];

测试代码如下:

clear,clc;x=[1 2 4 5,9  100];y=[1,2,3,4,5,7,9,10];%声明空间index_��ѧ,����x=zeros(1,length(x));index_y=zeros(1,length(x));pdata=zeros(1,length(y))*NaN;for i=1:length(x)    for j=1:length(y)        if x(i)==y(j)            index_x(i)=i;            index_y(i)=j;        end    endendindex_x(find(index_x==0))=[];index_y(find(index_y==0))=[];for n=1:length(index_x)%子集长度    pdata(index_y(n))=x(index_x(n));endresult=[pdata;y]

最终 CellLookup函数优化后代码如下:

function Result_data=CellLookup(x,y,xdata)    %author:2377389590@qq.com    % x为需要查找的    % y为x查找的范围数据    %xdata为当x=y时候,所匹配的数据,x和xdata数据是对应的    %声明空间    index_x=zeros(1,length(x));    index_y=zeros(1,length(x));    data=num2cell(zeros(length(y),2)*NaN);    for i=1:length(x)        for j=1:length(y)            if isequal(x(i),y(j))                index_x(i)=i;                index_y(i)=j;            end        end    end    index_x(find(index_x==0))=[];    index_y(find(index_y==0))=[];    data(:,1)=y;    for n=1:length(index_x)%子集长度 %        data(index_y(n),2)=x(index_x(n));       data(index_y(n),2)=xdata(index_x(n));    end    Result_data=data;end

5、详细测试

如图:根据A列序号匹配与D列序号所对应的E列名字

clear,clc;[Num,TxT,Raw]=xlsread('data.xlsx');CellLookup(Raw(:,4),Raw(:,1),Raw(:,5))

运行结果: 

 

还不懂的小伙伴可以下载代码直接测试:

链接:https://pan.baidu.com/s/1czaQyNSnpdG37tjQs_W0Vw 
提取码:faik 



伍佰目录声明:本站部分文章来源于网络,版权属于原作者所有。如有转载或引用文章/图片涉及版权问题,请联系我们处理.我们将在第一时间删除! 联系邮箱:tsk@qq.com

快速链接

最新收录

最新点入