如何从MATLAB中的Excel文件中提取元素?

比方说,我有一个Excel文件中的以下工作表:

First row 142 15 second row 258 30 third row 789 35 

我正在写一个MATLAB脚本,首先提取数字789 (因为在同一个文件的另一个表中find相同的数字)。 现在我也想提取与我的编号789相同的行号,但在第二列:这里是35

我正在寻找一种方法来find一个知道它的价值的元素的索引。 这样我可以find我已知的值789的行和颜色,并用它来提取相应的数字,这里是35

这里是我用于提取两张表中的冗余号码的代码

 firsttasks = xlsread('myfile1','Feuil1', 'A1:A3'); secondtaskes = xlsread('myfile1', 'Feuil2', 'A1:A3'); Lia = ismember(firsttaskes,secondtasks,'rows'); for i=1:3 if Lia(i) == 1 found = firsttasks(i); end end 

这是这个任务的一个解决scheme:

 firsttasks = xlsread('myfile1','Feuil1'); secondtaskes = xlsread('myfile1', 'Feuil2'); IDmatch = [(1:size(firsttasks,1))*bsxfun(@eq,firsttasks(:,1),secondtaskes(:,1).') 1:size(secondtaskes,1)]; IDmatch(:,IDmatch(1,:)==0) = []; t = [firsttasks(IDmatch(1,:),1)... abs(firsttasks(IDmatch(1,:),2)-secondtaskes(IDmatch(2,:),2))]; 

这里t(k,1)是ID, t(k,2)是这个ID的时间差。 没有nan s,因为我们没有比较不匹配的ID的值。

这个解决scheme不处理一个ID出现两次或更多的情况,因为你没有定义在这种情况下会发生什么(如果可能的话)。


怎么运行的?

我们通过比较列表之间的所有可能的ID组合来search2个列表之间的相等ID。 这是通过函数bsxfun完成的,该函数在两个input上应用二进制元素操作,同时扩展它们的单例尺寸以彼此匹配。 当这个函数的input是两个向量,大小为1乘以m和n乘1时,结果是一个m×n的matrix,其中每个元素是对不同元素组合的操作的结果从两个载体。 我们来看一个例子:

从Excel导入数据后,它看起来像这样:

 firsttasks = 142 15 258 30 789 35 76 32 94 15 46 48 32 97 secondtaskes = 142 23 258 76 789 34 46 75 32 21 67 48 

用ID firsttasks(:,1)secondtaskes(:,1)的向量进行比较(注意第二个向量是转置的),并得到以下输出:

 >> bsxfun(@eq,firsttasks(:,1),secondtaskes(:,1).') ans = 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 

在这个matrix中,每个元素(i,j)表示在firsttasks(i,1)secondtaskes(j,1)的ID之间的匹配。

接下来,我们用这个matrix乘以firsttasks的索引,以获得具有匹配的firsttasks中的行号,并且在没有的情况下获得零:

 >> (1:size(firsttasks,1))*bsxfun(@eq,firsttasks(:,1),secondtaskes(:,1).') ans = 1 2 3 6 7 0 

请注意,上述结果的索引代表第二个任务中的行,所以数字6表示第二个任务中的secondtaskes与第一个任务中的第六个 secondtaskes匹配。 现在我们将它们垂直地连接到第二个索引的索引,所以我们把这两个索引放在一起:

 >> IDmatch = [(1:size(firsttasks,1))*bsxfun(@eq,firsttasks(:,1),secondtaskes(:,1).') 1:size(secondtaskes,1)] IDmatch = 1 2 3 6 7 0 1 2 3 4 5 6 

我们删除所有不匹配的情况(即第一行中有一个零:

 >> IDmatch(:,IDmatch(1,:)==0) = [] IDmatch = 1 2 3 6 7 1 2 3 4 5 

我们把我们发现的所有ID都匹配起来:

 >> firsttasks(IDmatch(1,:),1) ans = 142 258 789 46 32 

并将它们水平连接在第二列的相应值的所有差异上:

 >> abs(firsttasks(IDmatch(1,:),2)-secondtaskes(IDmatch(2,:),2)) ans = 8 46 1 27 76 

所以我们得到:

 >> t = [firsttasks(IDmatch(1,:),1)... abs(firsttasks(IDmatch(1,:),2)-secondtaskes(IDmatch(2,:),2))] t = 142 8 258 46 789 1 46 27 32 76 

而已。