图1
图2
问题:我要根据图1的第一列店名和图2的店名为相等条件去匹配图1的第二列数据到图2黄色区域。
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
前面介绍的算法缺点是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:[email protected]
% 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
如图:根据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
MATLAB QQ交流群