其他分享
首页 > 其他分享> > MATLAB实现excel中vlookup函数的查找匹配功能

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

作者:互联网

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=data
end

3.运行效果

评价:完美匹配数据。

注意:此代码适合cell类型数据匹配。如果是其他类型请提前转换为其他类型

4.算法的改进:解决x不是y子集问题

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

下面是测试的代码:

clear,clc;
%x是y的子集,将x与y对应位置匹配,缺数据赋值为NaN
x=[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
    end
end
for n=1:length(index_x)%子集长度 
   pdata(index_y(n))=x(index_x(n));
end
result=[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
    end
end
index_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));
end
result=[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 


标签:index,end,vlookup,excel,length,zeros,MATLAB,data,xdata
来源: https://blog.51cto.com/u_12355165/2782172