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

时间:2017-06-10 02:21:31

标签: excel matlab

我们说我在excel文件中有以下表格:

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

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

我一直在寻找一种方法来查找元素的索引,知道它的值。通过这种方式,我可以找到已知值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

1 个答案:

答案 0 :(得分:0)

以下是此任务的一种解决方案:

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,因为我们无法比较不匹配ID的值。

此解决方案不处理一个ID在工作表中存在两次或更多的情况,因为您没有定义在这种情况下发生的情况(如果可能)。

如何运作?

我们通过比较列表之间所有可能的ID组合来搜索2个列表之间的相等ID。这是通过函数bsxfun完成的,该函数在两个输入上应用二元元素操作,同时扩展它们的单例维度以相互匹配。当这个函数的输入是两个向量时,大小为1乘m和n乘1,结果是m-by-n矩阵,其中每个元素是对不同元素组合的操作结果从两个向量。让我们看一个例子:

从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

在此矩阵中,每个元素(i,j)表示firsttasks(i,1)secondtaskes(j,1)中的ID匹配。

接下来,我们将firsttasks的索引乘以此矩阵,以获得firsttasks中匹配的行号,如果没有&#t; t,则为零:

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

请注意,上面结果的索引代表secondtaskes中的行,因此数字6表示secondtaskes中的行 4 匹配行 6 < / strong>在firsttasks中。现在我们将它们与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

那就是它。