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